目前的工作方式绝对是生产就绪的;但是,有些事情并不明显,这不是你的错。
让我试着一一回答你的问题。
- 很多图书馆甚至没有打字。
在 TypeScript 2.1 中,只要你在 node_modules 中安装了一个包并且你没有打开 noImplicitAny,你就可以导入任何你想要的东西。
如果您确实想使用noImplicitAny(我会建议您希望随着时间的推移而增长的任何项目),您可以随时在项目源文件夹中创建一个declarations.d.ts,根据需要声明模块:
// do anything you want when you import `"foo"` now.
declare module "foo";
// can only access the `hello` export when importing `"bar"`.
declare module "bar" {
export var hello;
}
- 许多图书馆的分型已经完全过时了。
您绝对应该随意向 DefinitiveTyped 发送拉取请求,但如果您真的时间紧迫,您可以使用我为第 (1) 点提供的方法。
- 很多库都有一个
global 类型文件,导致我不能import 它,因为 TS 抱怨它不是一个模块。
如果您需要使用来自definitelyTyped 的全局声明文件,并且它没有自动包含在您的项目中,您可能需要将它添加到tsconfig.json 的types 字段中。
请参阅我的另一个答案here,但关键是如果您需要包含foo 和bar 包的全局声明,并且您安装了@types/foo 和@types/bar,您可以编写以下内容在你的tsconfig.json。
{
"compilerOptions": {
"types": ["foo", "bar"]
}
}
- 当库的 NPM 包中正确包含
module 形状的类型文件时(如 moment.js),TS 似乎仍然无法找到它,并且错误行 import * as moment from 'moment' 说找不到模块。
我认为这与您针对 ES6 的事实有关。尝试将您的"moduleResolution" 选项更改为"node" 在您的tsconfig.json。
{
"compilerOptions": {
"moduleResolution": "node"
}
}
抱歉,这是一个问题。
理由是,唯一真正具有这种解析语义的模块加载系统是 CommonJS(Node 使用的策略)。
我同意这可以改进。