如何在没有<reference>的情况下在TypeScript中使用'Typings'导入模块?

时间:2016-10-30 20:14:58

标签: typescript jasmine protractor typescript-typings

我试图在 TypeScript 中使用量角器 Jasmine 编写测试。 TSD现已弃用,所以我必须使用&#39;打字&#39;操纵TypeScript定义。所以我安装了它:

npm install typings -g

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

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

我还添加了“文件”部分,并排除了&#39; node_modules&#39;:

// 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工作室都找不到所有Jasmine方法的定义和机会&#39;模块。错误是:

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

分别。这是我的spec文件:

enter image description here

在&#39; typings /&#39;文件夹我看到TypeScript定义的引用链接:

folders structure and typings/index.d.ts content

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

P.S。测试在转移到Javacript之后有效。

P.S.S。添加

后错误将消失
///<reference path="###"/>

到spec文件。但我不想使用它。

Protractor: 4.0.9;
TypeScript 2.0.3;
Typings 1.5.0;

提前致谢!

2 个答案:

答案 0 :(得分:6)

有一些因素阻碍了事情的发展。首先,如果您使用的是 Typescript 2.0 ,那么typings也会被弃用。

Typescript 2.0 支持节点模块中的打包类型(通常由npm install @types/module-name安装。明确键入的所有声明也可作为“@ types / *”命名空间下的npm模块使用,因此,如果您希望远离tsdtypings不应该是您的最终目的地。

话虽这么说,typescript 2.0仍然适用于打字,所以让我指出一些我在配置文件中看到的问题。

类型属性

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

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

文件/包含/排除属性

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

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

此外,您遇到的最大问题是您的include语法错误。 include采用 glob 模式。你不能只是简单地放置文件夹名称,但需要通过递归模式跟随它们:

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

最后一件事是你不需要排除node_modules。只有在排除可能与您的包含模式匹配的内容时,才需要排除。由于您的node_modules模式不匹配include,因此无需将其排除。

我认为,如果你做出这些微小的改变,事情应该按照你的预期运作,但同样,我会真正考虑一直走向新的基于@types/*的新版本,因为它们更容易管理更方便,不需要外部工具(除了npm),如typings或tsd。

答案 1 :(得分:1)

您需要按如下方式更新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进行设置而不是自己的设置。这是偏好。