如何在没有 <reference> 的情况下在 TypeScript 中导入带有“Typings”的模块?

Posted

技术标签:

【中文标题】如何在没有 <reference> 的情况下在 TypeScript 中导入带有“Typings”的模块?【英文标题】:How to import modules with ‘Typings’ in TypeScript without <reference>? 【发布时间】:2017-03-13 00:06:05 【问题描述】:

我正在尝试在 TypeScript 中使用 ProtractorJasmine 编写测试。 TSD 现在已弃用,因此我必须使用“打字”来操作 TypeScript 定义。所以我安装了它:

npm install typings -g

然后我用它来安装 Jasmine 和 Chance 这样的定义:

typings install jasmine --source dt --save –-global
typings install chance--source dt --save –-global

我还添加了 “files” 部分并排除了“node_modules”:

// tsconfig.json

  "compilerOptions": 
    "target": "es5",
    "module": "commonjs",
    "moduleResolution": "node",
    "sourceMap": true,
    "declaration": false,
    "noImplicitAny": false,
    "outDir": "tmp",
    "types": ["node", "jasmine", "chance"]
  ,
  "files": [
    "typings/index.d.ts"
  ],
  "include": [
    "lib",
    "specs"
  ],
  "exclude": [
    "node_modules"
  ]

问题是 WebStorm 和 Visual Code studio 都找不到所有 Jasmine 方法和“机会”模块的定义。错误是:

**“TS2304: Cannot find name 'describe'”** 
**“TS2307: Cannot find module 'chance'”**

分别。这是我的规范文件:

在“typings/”文件夹中,我看到了 TypeScript 定义的参考链接:

我错过了什么吗?为什么我的 IDE 找不到 Jasmine 和 Chance 的定义?

P.S. 转译成 Javacript 后可以测试。

P.S.S.添加后错误会消失

///<reference path="###"/>

到规范文件。但我不想用它。

Protractor: 4.0.9;
TypeScript 2.0.3;
Typings 1.5.0;

提前致谢!

【问题讨论】:

【参考方案1】:

有一些事情会妨碍您正常工作。首先,如果您使用的是 Typescript 2.0,那么 typings 也已被弃用。

Typescript 2.0 支持在 node 模块中打包类型(通常由 npm install @types/module-name 安装。在确定类型上可用的所有声明也可以作为“@types/*”命名空间下的 npm 模块使用,所以如果你想离开tsdtypings 不应该是你的最终目的地。

话虽如此,typescript 2.0 仍然可以处理类型,所以让我指出一些我在您的配置文件中看到的问题。

类型属性

 
    "types": ["node", "jasmine", "chance"]  

types, 属性仅用于@types/* 中基于 npm 包的新类型。由于您尚未使用此属性,因此您的 tsconfig.json 中不应包含此属性。 (有关此属性和相关属性的作用的完整讨论,请参阅 TypeScript 2: custom typings for untyped npm module。

文件/包含/排除属性


 "files": [
    "typings/index.d.ts"
  ],
  "include": [
    "lib",
    "specs"
  ],
  "exclude": [
    "node_modules"
  ]

虽然您可以选择同时使用这两个文件和包含属性,但这不是必需的。您可以将 files 数组中的 typings/index.d.ts 引用移动到 include array 中,然后删除 files

此外,您遇到的最大问题是您的 include 语法错误。 include 采用 glob 模式。您不能只是简单地输入文件夹名称,而是需要遵循递归模式:


  "include": [
    "typings/index.d.ts",
    "lib/**/*",
    "specs/**/*"
  ],

最后一件事是您不需要排除node_modules。排除仅用于排除与您的包含模式匹配的内容。由于node_modules 不会与您的include 模式匹配,因此无需排除它。

我认为,如果您进行这些小的更改,事情应该会按您的预期工作,但是我真的会一直考虑并迁移到基于 @types/* 的新类型,因为它们更易于管理并且更多方便,不需要像打字或 tsd 这样的外部工具(npm 除外)。

【讨论】:

有一个很好的使用 TypeScript 的 Protractor 项目设置示例 (github.com/angular/protractor-cookbook/tree/master/…)。我也同意你应该使用 TypeScript 2.0...还有一个 @types/chance 已发布。【参考方案2】:

您需要更新您的compilerOptions,如下所示:

  "compilerOptions": 
    "target": "es5",
    "module": "commonjs",
    "moduleResolution": "node",
    "sourceMap": true,
    "declaration": false,
    "noImplicitAny": false,
    "outDir": "tmp",
    "typeRoots": ["./typings"] // Updated!
  ,

typeRoots 自动在编译中包含指定文件夹下的所有定义文件,无需向相关文件添加引用指令,也无需创建索引文件(然后您需要随时更新您添加一个新的环境库)。

您当前的配置 ("types": ["node", "jasmine", "chance"]) 将仅搜索 node_modules/@types 中的定义文件,然后仅包括 nodejasminechance 定义。

这在tsconfig.json 文档中有详细说明。

编辑:您使用的是 JetBrains IDE。如果 IDE 正在为您编译 JS,请确保它使用您的 tsconfig.json 而不是它自己的设置。它在首选项中。

【讨论】:

以上是关于如何在没有 <reference> 的情况下在 TypeScript 中导入带有“Typings”的模块?的主要内容,如果未能解决你的问题,请参考以下文章

如何将这种类型的数据 <hdf5 object reference> 转换为 python 中更易读的东西?

如何让浏览器在访问链接时不要带上referer

无法在 Clang 上将 std::reference<T> 转换为 std::reference<const T>

std::reference_wrapper<std::any> 上的类型特征

NuGet - NU5131: nuspec文件中声明的引用没有被打包。

如何使用 SWIG 将 numpy 数组转换为 vector<int>&(参考)