我正在尝试从外部位置导入“.js”文件(即 node_modules )我正在尝试使用commonjs模块模式执行此操作,但是 import 我不想使用“.js”文件类型,直到我在同一文件夹中的“.js”文件附近添加“.d.ts”文件。
但问题是我不想用我的“.d.ts”文件影响任何 node_modules 。我希望它位于另一个文件夹中,与 node_modules 分开,但是一旦我这样做,typescript编译器就会抛出错误:
我有以下文件夹结构:
|- DTS
| |- y.d.ts
|- main.ts
|- y.js
y.js 具有以下内容
module.export = function (x) {
console.log(x);
};
y.d.ts 具有以下内容
export interface Y {
(x): any;
}
declare let y: Y;
export default y;
main.ts 具有以下内容
import * as y from './y'
现在我正在尝试用
编译 main.tstsc -m commonjs -t ES2015 main.ts
我会收到错误:
x.ts(1,20): error TS2307: Cannot find module './y'.
如何导入“.js”文件,并且能够在两个文件位于不同位置时定义它的“.d.ts”声明。
Here is the link to example project。一定要使用TypeScript 2.0版编译器。并在上面的tsc
命令中查看错误。
答案 0 :(得分:17)
注意:official recommendation for proving your type definitions采用的方法略有不同,如下所示。 我相信下面的方法稍好一些,因为* .d.ts文件几乎与最终产品相同。
在类型检查(构建时)期间,TypeScript使用* .ts文件和(大多数)忽略* .js文件。 让我举一个例子来激励你(我相信)你提出的建议。 假设存在一个非常好的JavaScript库,遗憾的是没有任何类型(例如N3)。 这是通过npm安装的,因此:
npm install n3 --save
这通常会添加到 ./ node_modules / n3 /...和project.json中。 如上所述,输入不存在,需要手动添加。 为此,我创建了一个 ./@ types / n3.d.ts 文件。 对于我们的目的而言,定义实际上并不是特别重要,但以下内容是一个良好的开端:
declare namespace N3 {
}
declare module "n3" {
export = N3;
}
现在回答你的问题。 更新“ tsconfig.json ”:
...
"compilerOptions": {
"typeRoots": [
"node_modules/@types",
"@types"
],
...
"paths": {
"*": [
...
"./@types/*"
]
仍然需要处理定位相应* .js文件的运行时解析,但这与您提出的问题不同。
供参考,您可能会发现What is new in TypeScript 和this discussion thread有用。
这种方法在处理全局变量时工作正常,但与模块不同。
更新' tsconfig.json ':
...
"paths": {
"*": [
...
"./@types/*"
],
"foo": [ "./@types/foo.d.ts" ]
},
...
答案 1 :(得分:0)
当给定带有相关文件的能够定义它" .d.ts"两个文件位于不同位置时的声明。
import
或.js
文件时, .d.ts
遵循相同的模块解析过程。