使用TypeScript 2.0导入js文件

抽象

我试图从外部位置(即node_modules )导入“.js”文件我试图做到这一点使用commonjs模块模式,但导入不希望与“.js”文件types的工作,直到我添加“ .d.ts“文件附近的”.js“文件放在同一个文件夹中。

但问题是我不想用我的“.d.ts”文件影响任何node_modules 。 我希望它位于另一个文件夹,从node_modules分开,但只要我这样做,打字稿编译器会引发错误:

我有以下文件夹结构:

|- DTS | |- ydts |- main.ts |- y.js 

y.js有以下内容

 module.export = function (x) { console.log(x); }; 

ydts有以下内容

 export interface Y { (x): any; } declare let y: Y; export default y; 

main.ts具有以下内容

 import * as y from './y' 

现在,当我试图编译main.ts

 tsc -m commonjs -t ES2015 main.ts 

我会得到一个错误:

 x.ts(1,20): error TS2307: Cannot find module './y'. 

如何导入“.js”文件并能够定义它的“.d.ts”声明,同时使这两个文件位于不同的位置。


编辑

这里是示例项目的链接 。 请务必使用TypeScript 2.0版编译器。 和上面的tsc命令来查看错误。

注意: 关于certificatetypes定义的官方build议与下面介绍的稍有不同。 我相信下面的方法稍微好一点,因为* .d.ts文件实际上与最终产品相同。

在types检查(构build时间)期间,TypeScript与* .ts文件一起工作,并且(大部分) 忽略* .js文件 。 让我举一个例子来激励你所提出的(我相信)。 假设存在一个完美的JavaScript库,可悲的是没有types(例如N3 )。 哪些已经通过npm安装,因此:

 npm install n3 --save 

这是典型的,被添加到./node_modules/n3 / …和project.json。 如上所述,types不存在,需要手动添加。 我为此创build了一个./@types/n3.d.ts文件。 就我们的目的而言,定义实际上并不是特别重要,但类似以下内容是一个好的开始:

 declare namespace N3 { } declare module "n3" { export = N3; } 

现在你的问题。 更新' tsconfig.json ':

 ... "compilerOptions": { "typeRoots": [ "node_modules/@types", "@types" ], ... "paths": { "*": [ ... "./@types/*" ] 

查找相应的* .js文件的运行时间解决scheme仍然是必要的,但这与您提出的问题是不同的问题。

为了参考你可能会发现什么是新的TypeScript和这个讨论线程有用。

这种方法在使用全局variables时工作正常,但与模块无关。

更新' tsconfig.json ':

 ... "paths": { "*": [ ... "./@types/*" ], "foo": [ "./@types/foo.d.ts" ] }, ... 

能够定义它的“.d.ts”声明,同时使这两个文件位于不同的位置。

当使用相关文件给出.js.d.ts文件时, import遵循相同的模块parsing过程。