使用TypeScript 2.0导入js文件

时间:2016-07-18 20:05:48

标签: javascript node.js typescript typescript2.0

摘要

我正在尝试从外部位置导入“.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.ts
tsc -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命令中查看错误。

2 个答案:

答案 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 TypeScriptthis discussion thread有用。

这种方法在处理全局变量时工作正常,但与模块不同。

更新' tsconfig.json ':

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

答案 1 :(得分:0)

  

能够定义它" .d.ts"两个文件位于不同位置时的声明。

当给定带有相关文件的import.js文件时,

.d.ts遵循相同的模块解析过程。