TypeScript 3.0

    TypeScript 3.0 还引入了一种新的tsc模式,即--build标记,它与工程引用同时运用可以加速构建TypeScript。

    相关详情请阅读工程引用手册

    TypeScript 3.0 增加了支持以元组类型与函数参数列表进行交互的能力。 如下:

    有了这些特性后,便有可能将转换函数和它们参数列表的高阶函数变为强类型的。

    当剩余参数里有元组类型时,元组类型被扩展为离散参数序列。 例如,如下两个声明是等价的:

    1. declare function foo(args_0: number, args_1: string, args_2: boolean): void;

    带有元组类型的展开表达式

    在函数调用中,若最后一个参数是元组类型的展开表达式,那么这个展开表达式相当于元组元素类型的离散参数序列。

    因此,下面的调用都是等价的:

    1. const args: [number, string, boolean] = [42, "hello", true];
    2. foo(42, "hello", true);
    3. foo(args[0], args[1], args[2]);
    4. foo(...args);

    剩余参数允许带有泛型类型,这个泛型类型被限制为是一个数组类型,类型推断系统能够推断这类泛型剩余参数里的元组类型。这样就可以进行高阶捕获和展开部分参数列表:

    例子

    上例的f2声明,类型推断可以推断出number[string, boolean]void做为TUV

    元组类型里的可选元素

    元组类型现在允许在其元素类型上使用?后缀,表示这个元素是可选的:

    例子

    1. let t: [number, string?, boolean?];
    2. t = [42, "hello", true];
    3. t = [42, "hello"];
    4. t = [42];

    --strictNullChecks模式下,?修饰符会自动地在元素类型中包含undefined,类似于可选参数。

    在元组类型的一个元素类型上使用?后缀修饰符来把它标记为可忽略的元素,且它右侧所有元素也同时带有了?修饰符。

    当剩余参数推断为元组类型时,源码中的可选参数在推断出的类型里成为了可选元组元素。

    带有可选元素的元组类型的length属性是表示可能长度的数字字面量类型的联合类型。 例如,[number, string?, boolean?]元组类型的length属性的类型是。

    元组类型里最后一个元素可以是剩余元素,形式为...X,这里X是数组类型。 剩余元素代表元组类型是开放的,可以有零个或多个额外的元素。 例如,[number, ...string[]]表示带有一个number元素和任意数量string类型元素的元组类型。

    例子

    1. function tuple<T extends any[]>(...args: T): T {
    2. return args;
    3. }
    4. const numbers: number[] = getArrayOfNumbers();
    5. const t2 = tuple("bar", ...numbers); // [string, ...number[]]

    这个带有剩余元素的元组类型的length属性类型是number

    TypeScript 3.0引入了一个顶级的unknown类型。 对照于anyunknown是类型安全的。 任何值都可以赋给unknown,但是当没有类型断言或基于控制流的类型细化时unknown不可以赋值给其它类型,除了它自己和any外。 同样地,在unknown没有被断言或细化到一个确切类型之前,是不允许在其上进行任何操作的。

    例子

    TypeScript 2.9和之前的版本不支持在JSX组件里使用声明。 用户通常不得不将属性声明为可选的,然后在render里使用非null的断言,或者在导出之前对组件的类型使用类型断言。

    我们可以利用它来处理React的defaultProps以及propTypes

    1. export interface Props {
    2. }
    3. export class Greet extends React.Component<Props> {
    4. render() {
    5. const { name } = this.props;
    6. return <div>Hello {name.toUpperCase()}!</div>;
    7. }
    8. static defaultProps = { name: "world"};
    9. }
    10. // Type-checks! No type assertions needed!
    11. let el = <Greet />

    defaultProps的确切类型

    默认类型是从defaultProps属性的类型推断而来。如果添加了显式的类型注释,比如static defaultProps: Partial<Props>;,编译器无法识别哪个属性具有默认值(因为defaultProps类型包含了Props的所有属性)。

    使用static defaultProps: Pick<Props, "name">;做为显式的类型注释,或者不添加类型注释。

    对于函数组件(之前叫做SFC),使用ES2015默认的初始化器:

    1. function Greet({ name = "world" }: Props) {
    2. return <div>Hello {name.toUpperCase()}!</div>;
    3. }

    @types/React的改动

    仍需要在@types/ReactJSX命名空间上添加LibraryManagedAttributes定义。

    TypeScript增加了一个新的三斜线指令(/// <reference lib="name" />),允许一个文件显式地包含一个已知的内置lib文件。

    内置的lib文件的引用和tsconfig.json里的编译器选项"lib"相同(例如,使用lib="es2015"而不是lib="lib.es2015.d.ts"等)。

    当你写的声明文件依赖于内置类型时,例如DOM APIs或内置的JS运行时构造函数如SymbolIterable,推荐使用三斜线引用指令。之前,这个.d.ts文件不得不添加重覆的类型声明。

    例子

    在某个文件里使用 /// <reference lib="es2017.string" />等同于指定编译选项。