属性没有初始值设定项,并且在构造函数中未明确分配

属性没有初始化器,并且在构造函数中没有明确赋值

Property has no initializer and is not definitely assigned in the constructor

当我们声明一个类属性而没有初始化它时,会出现“Property has no initializer and is not definitely assigned in the constructor”的错误。

要解决该错误,请为类属性提供初始值或使用非空断言。

属性没有初始值设定项

下面是错误如何发生的示例。

索引.ts
class Employee { // ⛔️ Error: Property 'name' has no initializer // and is not definitely assigned in the constructor.ts(2564) name: string; salary: number; tasks: string[]; }

我们在类上声明了特定类型的属性
,但没有给它们初始值。

错误的原因是我们声明了一个nametype的属性string,但是name我们类中的属性没有type的值string,它实际上是 undefined

为类属性提供初始值

解决该错误的一种方法是为类属性提供初始值。

索引.ts
class Employee { name = 'Bobby Hadz'; salary = 0; tasks: string[] = []; address: { country: string; city: string } = { country: '', city: '', }; }

我写了一份关于
如何设置类属性默认值的详细指南。

使用非空断言运算符代替

如果您不想为字段提供初始值并希望消除错误,可以使用
非空断言运算符 (!)

索引.ts
class Employee { name!: string; salary!: number; tasks!: string[]; }

非空断言运算符 (!)从类型中删除null和 ,而不执行任何显式类型检查。undefined

我们有效地告诉 TypeScript 类属性属于指定类型,而不是nullundefined

在类的构造函数中提供初始值

另一种方法是在类的构造函数方法内为类属性提供初始值。

索引.ts
class Employee { name: string; salary: number; tasks: string[]; constructor() { this.name = ''; this.salary = 0; this.tasks = []; } }

这与我们在第一个代码示例中所做的非常相似。

将类属性标记为可选

解决该错误的另一种方法是将类属性标记为
可选

索引.ts
class Employee { name?: string; salary?: number; tasks?: string[]; }
我们将类属性标记为可选。换句话说,它们可以是指定的类型,也可以是undefined.

现在我们可以声明属性而不给它们赋值,因为
undefined包含在它们的类型中。

禁用属性初始化的类型检查

如果要禁用整个项目的属性初始化的类型检查,请使用
tsconfig.json文件
中的
strictPropertyInitialization选项。

tsconfig.json文件
{ "compilerOptions": { // ... rest "strictPropertyInitialization": false } }

如果您的tsconfig.json文件将该strict选项设置为true,请确保在strictPropertyInitialization下面添加strict

tsconfig.json文件
{ "compilerOptions": { "strict": true, // 👈️ if you have this "strictPropertyInitialization": false // 👈️ add this below } }

现在您可以声明类属性而不初始化它们:

索引.ts
class Employee { name: string; salary: number; tasks: string[]; }

如果这没有生效,请尝试重新启动 IDE。

当该strictPropertyInitialization选项设置为 时,当我们声明类属性但不为其提供初始值时,类型检查器会抛出错误。 true

相反,如果设置为false,则在声明没有初始化程序的类属性时不会抛出任何错误。

如果您设置strictPropertyInitializationfalse,它适用于您的整个项目,这可能不是您想要的。

总而言之,当我们声明特定类型的类属性而不为其指定指定类型的值时,会导致“属性没有初始化程序”错误。

最好的解决方案是为属性提供初始值或将属性标记为可选。

额外资源

您可以通过查看以下教程来了解有关相关主题的更多信息: