TypeScript 2.7

    以下代码用于没有编译错误:

    但是,这_是_一个错误:

    1. triple = pair;

    现在,相互赋值是一个错误。 这是因为元组现在有一个长度属性,其类型是它们的长度。 所以pair.length: 2,但是triple.length: 3

    1. const struct: [string, number] = ['key'];
    2. for (const n of numbers) {
    3. struct.push(n);

    对此最好的解决方法是创建扩展Array的自己的类型:

    allowSyntheticDefaultImports下,对于TS和JS文件来说默认导入的类型合成不常见

    在过去,我们在类型系统中合成一个默认导入,用于TS或JS文件,如下所示:

    1. export const foo = 12;

    意味着模块的类型为{foo: number, default: {foo: number}}。 这是错误的,因为文件将使用__esModule标记发出,因此在加载文件时没有流行的模块加载器会为它创建合成默认值,并且类型系统推断的default成员永远不会在运行时存在。现在我们在ESModuleInterop标志下的发出中模拟了这个合成默认行为,我们收紧了类型检查器的行为,以匹配你期望在运行时所看到的内容。如果运行时没有其他工具的介入,此更改应仅指出错误的错误默认导入用法,应将其更改为命名空间导入。

    1. interface O {
    2. foo?: string;
    3. }
    4. function fails<K extends keyof O>(o: O, k: K) {
    5. var s: string = o[k]; // Previously allowed, now an error
    6. // string | undefined is not assignable to a string
    7. }

    in表达式被视为类型保护

    对于n in x表达式,其中n是字符串文字或字符串文字类型而x是联合类型,”true”分支缩小为具有可选或必需属性n的类型,并且 “false”分支缩小为具有可选或缺少属性n的类型。 如果声明类型始终具有属性n,则可能导致在false分支中将变量的类型缩小为的情况。

    以前在结构上相同的类在条件或||运算符中被简化为最佳公共类型。现在这些类以联合类型维护,以便更准确地检查instanceof运算符。

    1. class Animal {
    2. }
    3. class Dog {
    4. park() { }
    5. }
    6. var a = Math.random() ? new Animal() : new Dog();
    7. // typeof a now Animal | Dog, previously Animal

    CustomEvent现在是一个泛型类型

    CustomEvent现在有一个details属性类型的类型参数。如果要从中扩展,则需要指定其他类型参数。

    1. }