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

如果属性初始化为null,则TypeScript接口不会导致错误,typescript,Typescript,正如您所看到的,年龄是一个数字,如果我尝试将其初始化为数字以外的其他内容,它会相应地出错。但是,如果我将其初始化为null,然后再将其设置为null,则doSomething将其视为对象不会导致任何错误 TypeScript在尝试设置this.age(这是一个数字)上的某些属性时,难道不能给出一个错误吗?若否,原因为何?我是否需要做一些额外的事情来告诉TypeScript this.age是一个数字 interface MyServiceInterface { age: number;

正如您所看到的,年龄是一个数字,如果我尝试将其初始化为数字以外的其他内容,它会相应地出错。但是,如果我将其初始化为null,然后再将其设置为null,则doSomething将其视为对象不会导致任何错误

TypeScript在尝试设置this.age(这是一个数字)上的某些属性时,难道不能给出一个错误吗?若否,原因为何?我是否需要做一些额外的事情来告诉TypeScript this.age是一个数字

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

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

这不会给您一个编译时错误的原因是因为它属于doSomething中的any类型。TypeScript目前并不是在所有场景中都采用这种类型,也无法在函数中指定这种类型;然而,能够做到这一点还有一个开放的空间

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

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
    }
  };
}

…这很烦人,使开发人员更容易出错。

谢谢,非常有帮助。