在 TypeScript 3.1 中使用节点模块分辨率时,当 TypeScript 破解打开package.json
文件以确定需要读取哪些文件时,它首先会查看名为typesVersions
的新字段。带有typesVersions
字段的package.json
可能如下所示:
{
"name": "package-name",
"version": "1.0",
"types": "./index.d.ts",
"typesVersions": {
">=3.1": { "*": ["ts3.1/*"] }
}
}
这package.json
告诉TypeScript检查当前版本的TypeScript是否正在运行。如果它是3.1或更高版本,它会计算出您相对于包导入的路径,并从包的ts3.1
文件夹中读取。这就是{ "*": ["ts3.1/*"] }
表达的意思 - 如果你现在熟悉路径映射,它的工作原理就是这样的。
因此,在上面的示例中,如果我们从"package-name"
中导入,在TypeScript 3.1中运行时,我们将尝试从[...]/node_modules/package-name/ts3.1/index.d.ts
(和其他相关路径)解析。如果我们从package-name/foo
导入,我们将尝试寻找[...]/node_modules/package-name/ts3.1/foo.d.ts
和[...]/node_modules/package-name/ts3.1/foo/index.d.ts
。
如果我们在这个例子中没有在 TypeScript 3.1 中运行怎么办?好吧,如果typesVersions
中没有匹配的字段,TypeScript会回退到types
字段,因此 TypeScript 3.0 及更早版本将被重定向到[...]/node_modules/package-name/index.d.ts
。
匹配行为
TypeScript决定编译器和语言版本是否匹配的方式是使用Node的semver范围。
多个字段
typesVersions
可以支持多个字段,其中每个字段名称由要匹配的范围指定。
{
"name": "package-name",
"version": "1.0",
"types": "./index.d.ts",
"typesVersions": {
">=3.2": { "*": ["ts3.2/*"] },
">=3.1": { "*": ["ts3.1/*"] }
}
}
由于范围可能会重叠,因此确定应用哪种重定向是特定于订单的。这意味着在上面的示例中,即使>=3.2
和>=3.1
匹配器都支持 TypeScript 3.2 及更高版本,反转顺序也可能有不同的行为,因此上述示例将不等同于以下示例:
{
"name": "package-name",
"version": "1.0",
"types": "./index.d.ts",
"typesVersions": {
// NOTE: this doesn't work!
">=3.1": { "*": ["ts3.1/*"] },
">=3.2": { "*": ["ts3.2/*"] }
}
}
标签:TypeScript
相关阅读 >>
更多相关阅读请进入《typescript》频道 >>

Vue.js 设计与实现 基于Vue.js 3 深入解析Vue.js 设计细节
本书对 Vue.js 3 技术细节的分析非常可靠,对于需要深入理解 Vue.js 3 的用户会有很大的帮助。——尤雨溪,Vue.js作者