TypeScript 3.1
MapToPromise
接收参数T
,当它是个像Coordinate
这样的元组时,只有数值型属性会被转换。 [number, number]
具有两个数值型属性:0
和1
。 针对这样的数组,MapToPromise
会创建一个新的元组,0
和1
属性是原类型的一个Promise
。 因此PromiseCoordinate
的类型为[Promise<number>, Promise<number>]
。
TypeScript 3.1提供了在函数声明上定义属性的能力,还支持const
声明的函数。只需要在函数直接给属性赋值就可以了。 这样我们就可以规范JavaScript代码,不必再借助于namespace
。 例子:
function readImage(path: string, callback: (err: any, image: Image) => void) {
// ...
}
return decodeImageSync(contents);
}
这里,readImage
函数异步地读取一张图片。 此外,我们还在readImage
上提供了一个便捷的函数readImage.sync
。
[1] 更确切地说,是上面那种同态映射类型。
由社区的反馈还有我们的经验得知,利用最新的TypeScript功能的同时容纳旧版本的用户很困难。 TypeScript引入了叫做typesVersions
的新特性来解决这种情况。
在TypeScript 3.1里使用Node模块解析时,TypeScript会读取package.json
文件,找到它需要读取的文件,它首先会查看名字为typesVersions
的字段。 一个带有typesVersions
字段的package.json
文件:
{
"name": "package-name",
"version": "1.0",
"types": "./index.d.ts",
"typesVersions": {
">=3.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 ranges去决定编译器和语言版本。
多个字段
因为范围可能会重叠,因此指定的顺序是有意义的。 在上例中,尽管>=3.2
和>=3.1
都匹配TypeScript 3.2及以上版本,反转它们的顺序将会有不同的结果,因此上例与下面的代码并不等同。
{
"name": "package-name",
"version": "1.0",
"types": "./index.d.ts",
"typesVersions": {
// 注意,这样写不生效
">=3.1": { "*": ["ts3.1/*"] },
">=3.2": { "*": ["ts3.2/*"] }
}