考虑这个例子:
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
?
答案 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'。