TypeScript 1.4

    阅读issue #868以了解更多关于联合类型的破坏性改动。

    当有多个最佳通用类型可用时,现在编译器会做出选择(依据编译器的具体实现)而不是直接使用第一个。

    这会在多种情况下发生。具有一组共享的必需属性和一组其它互斥的(可选或其它)属性,空类型,兼容的签名类型(包括泛型和非泛型签名,当类型参数上应用了时)。

    推荐 使用类型注解指定你要使用的类型。

    1. var bs: { x: number; y?: number; z?: number }[] = [b, a];
    1. declare function foo<T>(x: T, y:T): T;
    2. var r = foo(1, ""); // r used to be {}, now this is an error

    添加约束:

    在这里查看。

    推荐 如果这种不匹配的行为是故意为之,那么明确指定类型参数:

    1. var r = foo<string|number>(1, ""); // Most useful
    2. var r = foo<any>(1, ""); // Easiest

    重写函数定义指明就算不匹配也没问题:

    1. declare function foo<T,U>(x: T, y:U): T|U;
    2. function f<T extends Animal, U extends Animal>(x: T, y: U): T|U { return undefined; }

    new Array(...)也一样

    推荐 声明向后兼容的签名,如果1.0的行为是你想要的:

    1. function makeArray<T>(...items: T[]): T[];
    2. function makeArray(...items: {}[]): {}[];
    3. function makeArray<T>(...items: T[]): T[] { return items; }
    1. var r9 = f10('', () => (a => a.foo), 1); // r9 was any, now this is an error

    推荐 手动指定一个类型参数

    ECMAScript 2015语言规范(ECMA-262 6th Edition)指明ClassDeclarationClassExpression使用严格模式。 因此,在解析类声明或类表达式时将使用额外的限制。

    1. class implements {} // Invalid: implements is a reserved word in strict mode
    2. class C {
    3. foo(arguments: any) { // Invalid: "arguments" is not allow as a function argument
    4. var eval = 10; // Invalid: "eval" is not allowed as the left-hand-side expression
    5. arguments = []; // Invalid: arguments object is immutable
    6. }

    关于严格模式限制的完整列表,请阅读 Annex C - The Strict Mode of ECMAScript of ECMA-262 6th Edition。