TypeScript中private dog: TDog | undefined与dog?: TDog的区别及?的称谓
TypeScript类私有成员两种声明的差异与可选属性语法说明
两种私有成员声明的差异
针对你提到的两种类私有成员写法:
private dog: TDog | undefined;
和
private dog?: TDog;
二者存在以下关键差异:
初始化规则不同
- 第一种写法中,
dog是必填成员,必须在声明时或构造函数中显式初始化(哪怕赋值为undefined),否则TypeScript会抛出初始化错误。 - 第二种写法属于可选成员,无需显式初始化,TypeScript会默认将其视为
undefined,不会强制要求初始化。
- 第一种写法中,
类型语义不同
private dog: TDog | undefined表示该成员必然存在于类实例中,只是它的值允许是TDog类型或者undefined。private dog?: TDog表示该成员可能不存在于类实例中:当你没有给它赋值时,实例上不会有这个属性;赋值后才会存在,且值为TDog类型。不过在类内部代码中,你始终能访问到这个成员(未赋值时返回undefined)。
编译后JS表现不同
- 第一种写法编译后的JavaScript代码中,该属性会被显式添加到实例上(值为
undefined)。 - 第二种写法如果未赋值,编译后的实例上不会包含该属性,只有当你给它赋值后,属性才会出现在实例中。
- 第一种写法编译后的JavaScript代码中,该属性会被显式添加到实例上(值为
?的官方称谓
这个?在TypeScript中的官方英文称谓是 Optional Property Marker,翻译成中文为 可选属性标记。它的作用是标记对象(包括类实例)的某个属性为可选,即该属性可以不存在,或者存在时符合指定的类型。
内容的提问来源于stack exchange,提问作者Ben
相关产品推荐
相关产品推荐

