注:证明类型定义的官方建议 https://github.com/DefinitelyTyped/DefinitelyTyped/blob/master/README.md#test-a-new-package采用与下面介绍的方法略有不同的方法。
我相信下面的方法稍微好一些,因为 *.d.ts 文件实际上与最终产品相同。
在类型检查(构建时)期间,TypeScript 使用 *.ts 文件并且(大部分)忽略 *.js 文件。
让我举一个例子来激发你(我相信)你的提议。
假设存在一个完美的 JavaScript 库,遗憾的是没有类型(例如N3 https://github.com/RubenVerborgh/N3.js/)。
它是通过 npm 安装的,因此:
npm install n3 --save
正如典型的那样,这被添加到./node_modules/n3/...和项目.json。
如前所述,类型不存在,需要手动添加。
我创建一个./@types/n3.d.ts为此目的而归档。
就我们的目的而言,定义实际上是什么并不特别重要,但如下所示是一个好的开始:
declare namespace N3 {
}
declare module "n3" {
export = N3;
}
现在回答你的问题。
更新'tsconfig.json':
...
"compilerOptions": {
"typeRoots": [
"node_modules/@types",
"@types"
],
...
"paths": {
"*": [
...
"./@types/*"
]
仍然需要处理运行时解析来查找相应的 *.js 文件,但这与您提出的问题不同。
作为参考,您可能会发现TypeScript 中的新功能 https://github.com/Microsoft/TypeScript/wiki/What's-new-in-TypeScript
and 这个讨论话题 https://github.com/Microsoft/TypeScript-Handbook/issues/213 useful.
这种方法在处理全局变量时效果很好,但在处理模块时效果不佳。
更新'tsconfig.json':
...
"paths": {
"*": [
...
"./@types/*"
],
"foo": [ "./@types/foo.d.ts" ]
},
...