TypeScript 2.0

    类型细化不会在函数,类和lambda表达式上进行。

    例子

    编译器不知道回调函数什么时候被执行。考虑下面的情况:

    1. var x: number | string = "a";
    2. if (typeof x === "string") {
    3. }
    4. x = 5;

    x.charAt()被调用的时候把x的类型当作string是错误的,事实上它确实不是string类型。

    推荐

    使用常量代替:

    1. function g<T>(obj: T) {
    2. if (obj instanceof RegExp) {
    3. t = obj; // RegExp is not assignable to T
    4. }

    推荐 可以把局部变量声明为特定类型而不是泛型参数或者使用类型断言。

    例子

    推荐

    定义一个不对属性写值的setter。

    在严格模式下这已经是一个运行时错误。从TypeScript 2.0开始,它会被标记为编译时错误。

    例子

    1. if( true ) {
    2. function foo() {}
    3. }
    4. export = foo;

    使用函数表达式代替:

    ES2015模版字符串总是将它们的标签以不可变的类数组对象进行传递,这个对象带有一个属性(同样是不可变的)。 TypeScript把这个对象命名为TemplateStringsArray

    便利的是,TemplateStringsArray可以赋值给Array<string>,因此你可以利用这个较短的类型来使用标签参数:

    1. function myTemplateTag(strs: string[]) {
    2. // ...

    然而,在TypeScript 2.0,支持用readonly修饰符表示这些对象是不可变的。 这样的话,TemplateStringsArray 就变成了不可变的,并且不再可以赋值给string[]

    推荐

    直接使用TemplateStringsArray(或者使用ReadonlyArray<string>)。