TypeScript 3.1

元组和数组上的映射类型

在 TypeScript 3.1 中,作用于元组和数组上的映射对象类型[1] 现在会产生新的元组/数组,而不是创建一个成员(如 push()pop()length)被转换过的新类型。例如

ts
type 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] 中,有两个数值命名属性:01。当给定这样的元组时,MapToPromise 将创建一个新的元组,其中 01 属性是原类型的 Promise。因此,最终类型 PromiseCoordinate 的结果类型为 [Promise<number>, Promise<number>]

函数上的属性声明

TypeScript 3.1 带来了在函数声明和 const 声明的函数上定义属性的能力,只需在同一作用域内对这些函数上的属性进行赋值即可。这使我们能够编写规范的 JavaScript 代码,而无需诉诸 namespace 这种 hack 手段。例如

ts
function 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)上表达常见的模式,如 defaultPropspropTypes

ts
export const FooComponent = ({ name }) => <div>Hello! I am {name}</div>;
FooComponent.defaultProps = {
name: "(anonymous)",
};

[1] 更具体地说,是上述形式中的同态映射类型。

使用 typesVersions 进行版本选择

来自社区的反馈以及我们自己的经验表明,在利用最新的 TypeScript 特性的同时还要兼顾使用旧版本的用户是非常困难的。TypeScript 引入了一个名为 typesVersions 的新功能来帮助应对这些场景。

您可以在 声明文件部分的“发布”章节 中了解更多相关信息。

TypeScript 文档是一个开源项目。通过 提交 Pull Request 来帮助我们改进这些页面 ❤

此页面的贡献者
DRDaniel Rosenwasser (51)
OTOrta Therox (18)
CFCory Forsyth (1)
MUMasato Urai (1)
SSSebastian Silbermann (1)
10+

最后更新:2026 年 3 月 27 日