如果将属性初始化为null,则TypeScript接口不会导致错误

时间:2015-03-20 17:01:28

标签: typescript

正如您所看到的,年龄是一个数字,如果我尝试将其初始化为数字以外的其他内容,则会出错。但是,如果我将其初始化为null并稍后设置它,那么doSomething将其视为对象时不会出现任何错误。

TypeScript是否应该在尝试在this.age上设置someProperty时出错,这是一个数字?如果没有,为什么?我是否需要做一些额外的事情来告诉TypeScript this.age是一个数字?

interface MyServiceInterface {
  age: number;
  doSomething () : void;
}

function myService () : MyServiceInterface {
  return {
    age: null,
    doSomething: function () {
      this.age.someProperty = false;
    }
  };
}

1 个答案:

答案 0 :(得分:0)

这不会给您带来编译时错误的原因是因为thisany中属于doSomething类型。 TypeScript目前在所有场景中都不假设this的类型,并且无法在函数中指定this的类型;但是,有一个开放的feature request能够做到这一点。

我建议您更改代码以使用类:

class MyService implements MyServiceInterface {
    age: number;

    doSomething() {
        this.age.someProperty = false; // error
    }
}

此代码更具可读性,更能表达意图。

或者,您可以将现有功能更改为:

function myService () : MyServiceInterface {
  return {
    age: null,
    doSomething: function () {
      var self = <MyServiceInterface> this;
      self.age.someProperty = false; // error
    }
  };
}

...这很烦人,更容易让开发人员出错。