为什么TypeScript中的非可选属性的属性初始化是可选的?

时间:2017-07-25 07:53:36

标签: typescript types

考虑这个例子:

class A {
    optional?: string;
    nonOptional: string;
    constructor() {

    }
}

let a = new A();

function consumeString(str: string) {
    console.log(str.length);
}

consumeString(a.optional);
consumeString(a.nonOptional);

启用strictNullChecks后,TypeScript 2.4.2将拒绝第一次调用;

  

类型'string | undefined'的参数不能分配给'string'类型的参数     输入“undefined' is not assignable to type'字符串'。”

但是,在运行时,第二次调用也会失败,因为a.nonOptional没有引用字符串。

为什么TypeScript不强制初始化nonOptional

2 个答案:

答案 0 :(得分:2)

这是在TypeScript 2.7中修复的TypeScript中的错误或错误设计。

默认情况下,TypeScript 2.7会拒绝您的代码,并且会说nonOptional需要初始化。

TypeScript 2.7引入了strictPropertyInitialization功能,要求必须在contstructor(或我的赋值默认值)中初始化类的必填字段。

(您可以禁用此检查,将strictPropertyInitialization = false传递给编译器以恢复为TypeScript< 2.7行为,但不鼓励这样做。

答案 1 :(得分:0)

编译器不会告诉你如何编码 您可以在任何给定时间自由分配值,只要它是一个字符串,编译器就不会争辩。如果你不这样做,那也是有效的。

如果您想要防范这种情况,请将类型更改为:

nonOptional: string | undefined;

然后这个:

consumeString(a.nonOptional);

将导致:

  

类型'字符串|的参数未定义'不能分配给参数   键入' string'。
  输入' undefined'不能指定为' string'。