元组和数组上的映射类型
在 TypeScript 3.1 中,作用于元组和数组上的映射对象类型[1] 现在会产生新的元组/数组,而不是创建一个成员(如 push()、pop() 和 length)被转换过的新类型。例如
tstype MapToPromise<T> = { [K in keyof T]: Promise<T[K]> };type Coordinate = [number, number];type PromiseCoordinate = MapToPromise<Coordinate>; // [Promise<number>, Promise<number>]
MapToPromise 接收一个类型 T,当该类型为类似 Coordinate 的元组时,只有数值属性会被转换。在 [number, number] 中,有两个数值命名属性:0 和 1。当给定这样的元组时,MapToPromise 将创建一个新的元组,其中 0 和 1 属性是原类型的 Promise。因此,最终类型 PromiseCoordinate 的结果类型为 [Promise<number>, Promise<number>]。
函数上的属性声明
TypeScript 3.1 带来了在函数声明和 const 声明的函数上定义属性的能力,只需在同一作用域内对这些函数上的属性进行赋值即可。这使我们能够编写规范的 JavaScript 代码,而无需诉诸 namespace 这种 hack 手段。例如
tsfunction readImage(path: string, callback: (err: any, image: Image) => void) {// ...}readImage.sync = (path: string) => {const contents = fs.readFileSync(path);return decodeImageSync(contents);};
在这里,我们有一个函数 readImage,它以非阻塞的异步方式读取图像。除了 readImage,我们还在 readImage 本身提供了一个名为 readImage.sync 的便利函数。
虽然 ECMAScript 导出通常是提供此功能的更好方法,但这种新的支持使以这种风格编写的代码能够在 TypeScript 中“直接工作”。此外,这种属性声明方法使我们能够在 React 函数组件(以前称为 SFC)上表达常见的模式,如 defaultProps 和 propTypes。
tsexport const FooComponent = ({ name }) => <div>Hello! I am {name}</div>;FooComponent.defaultProps = {name: "(anonymous)",};
[1] 更具体地说,是上述形式中的同态映射类型。
使用 typesVersions 进行版本选择
来自社区的反馈以及我们自己的经验表明,在利用最新的 TypeScript 特性的同时还要兼顾使用旧版本的用户是非常困难的。TypeScript 引入了一个名为 typesVersions 的新功能来帮助应对这些场景。
您可以在 声明文件部分的“发布”章节 中了解更多相关信息。