Typescript:具有默认值的可选和非可选类成员之间有什么区别

Typescript:具有默认值的可选和非可选类成员之间有什么区别,typescript,Typescript,它们似乎都被定义并能够接受新的价值。所以我的问题是:这两个参数之间有什么区别?是否存在第二个成员可能未定义的相关初始化情况?区别在于属性类型在以后的可选赋值方面有所不同。将鼠标悬停在这些属性上: class Stuff { id: number[] = []; age?: number[] = []; } let p = new Stuff(); p.id.push(1); p.age.push(1); alert(p.id); alert(p.age); 对于id,赋值是必须的,因

它们似乎都被定义并能够接受新的价值。所以我的问题是:这两个参数之间有什么区别?是否存在第二个成员可能未定义的相关初始化情况?

区别在于属性类型在以后的可选赋值方面有所不同。将鼠标悬停在这些属性上:

class Stuff {
  id: number[] = [];
  age?: number[] = [];
}

let p = new Stuff();
p.id.push(1);
p.age.push(1);
alert(p.id);
alert(p.age);
对于
id
,赋值是必须的,因为非可选类属性的初始化必须在构造函数中进行,或者作为直接赋值。 虽然这两个成员在默认情况下都不是未定义的,但TypeScript将允许您稍后仅为
age
分配
undefined

(property) Stuff.id: number[]
(property) Stuff.age?: number[] | undefined
此外,如果在编译器选项中启用了
stricnullchecks
,则示例已引发错误。由于
age
可以包含未定义的内容,TypeScript对此不确定。您需要首先检查它:

// you cannot do that...
p.id = undefined
// , but this is allowed
p.age = undefined

希望,这会有帮助

// Object is possibly 'undefined'.
p.age.push(1);

// works
if (p.age === undefined) p.age = [];
else p.age.push(1);