TypeScript编译文件找不到模块。

4

我在一个TypeScript项目中的一个文件(parser.js)里有一个已导出的模块,在编译阶段没有产生任何错误,但编译后的文件无法正常工作,这让我感到很困惑。

// parser.d.ts
declare module 'parser' {
    interface Parser {
        parser(url: string):string
    }

    export class UrlParser implements Parser {
        parser(url: string): string  {
            return  url.includes('https') ? url.replace('https', 'http') : '';
        }
    }
}

// parser.js
export default class UrlParser {
    parser(url)  {
        return  url.includes('https') ? url.replace('https', 'http') : '';
    }
}

/// <reference path="../lib/parser.d.ts" />
import * as Parser  from 'parser';

let urlParser = new Parser.UrlParser()
console.log(urlParser.parser('https://www.baidu.com'))

// compiled file I got
"use strict";
var __importStar = (this && this.__importStar) || function (mod) {
    if (mod && mod.__esModule) return mod;
    var result = {};
    if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
    result["default"] = mod;
    return result;
};
Object.defineProperty(exports, "__esModule", { value: true });
/// <reference path="../lib/parser.d.ts" />
var Parser = __importStar(require("parser"));
var urlParser = new Parser.UrlParser();
console.log(urlParser.parser('https://www.baidu.com'));

我执行 node ./dest/main/js 命令时遇到了一个错误。

Error: Cannot find module 'parser'

你能分享一下你是如何生成parser.js的吗?或者关于ts文件的package.json呢? - m.akbari
1个回答

1
在那个导入语句中应该使用相对路径(例如'./dest/lib/parser'),因为默认情况下,如果没有传递路径,require 将会在 node_modules 中查找(而 TypeScript 可以告诉它 'parser' 的位置)。您还可以在与 parser.js 相同的文件夹中添加一个包含内容 { name: 'parser' }package.json 文件,这将允许通过 require('parser') 找到它。

谢谢您的回答,我想在带有类型系统的TypeScript项目中导入JavaScript文件。我该怎么做? - makmav
我参考了文档,我理解错了吗? - makmav
我无法确定你是否理解错误,我需要看看你的整个项目结构和tsconfig长什么样子。你不应该导入声明文件,而应该导入真正的模块。将 import * as Parser from 'parser' 改为 import Parser from './path/to/parser';,这样导入就不会失败了。 - Robbie Milejczak

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接