属性没有初始化器,并且在构造函数中没有明确赋值
Property has no initializer and is not definitely assigned in the constructor
当我们声明一个类属性而没有初始化它时,会出现“Property has no initializer and is not definitely assigned in the constructor”的错误。
要解决该错误,请为类属性提供初始值或使用非空断言。
下面是错误如何发生的示例。
class Employee { // ⛔️ Error: Property 'name' has no initializer // and is not definitely assigned in the constructor.ts(2564) name: string; salary: number; tasks: string[]; }
我们在类上声明了特定类型的属性
,但没有给它们初始值。
name
type的属性string
,但是name
我们类中的属性没有type的值string
,它实际上是。 undefined
为类属性提供初始值
解决该错误的一种方法是为类属性提供初始值。
class Employee { name = 'Bobby Hadz'; salary = 0; tasks: string[] = []; address: { country: string; city: string } = { country: '', city: '', }; }
我写了一份关于
如何设置类属性默认值的详细指南。
使用非空断言运算符代替
如果您不想为字段提供初始值并希望消除错误,可以使用
非空断言运算符 (!)。
class Employee { name!: string; salary!: number; tasks!: string[]; }
非空断言运算符 (!)从类型中删除null
和 ,而不执行任何显式类型检查。undefined
null
或undefined
。在类的构造函数中提供初始值
另一种方法是在类的构造函数方法内为类属性提供初始值。
class Employee { name: string; salary: number; tasks: string[]; constructor() { this.name = ''; this.salary = 0; this.tasks = []; } }
这与我们在第一个代码示例中所做的非常相似。
将类属性标记为可选
解决该错误的另一种方法是将类属性标记为
可选。
class Employee { name?: string; salary?: number; tasks?: string[]; }
undefined
.现在我们可以声明属性而不给它们赋值,因为
undefined
包含在它们的类型中。
禁用属性初始化的类型检查
如果要禁用整个项目的属性初始化的类型检查,请使用
tsconfig.json文件
中的strictPropertyInitialization选项。
{ "compilerOptions": { // ... rest "strictPropertyInitialization": false } }
如果您的tsconfig.json
文件将该strict
选项设置为true
,请确保在strictPropertyInitialization
下面添加strict
。
{ "compilerOptions": { "strict": true, // 👈️ if you have this "strictPropertyInitialization": false // 👈️ add this below } }
现在您可以声明类属性而不初始化它们:
class Employee { name: string; salary: number; tasks: string[]; }
如果这没有生效,请尝试重新启动 IDE。
strictPropertyInitialization
选项设置为 时,当我们声明类属性但不为其提供初始值时,类型检查器会抛出错误。 true
相反,如果设置为false
,则在声明没有初始化程序的类属性时不会抛出任何错误。
如果您设置strictPropertyInitialization
为false
,它适用于您的整个项目,这可能不是您想要的。
总而言之,当我们声明特定类型的类属性而不为其指定指定类型的值时,会导致“属性没有初始化程序”错误。
最好的解决方案是为属性提供初始值或将属性标记为可选。
额外资源
您可以通过查看以下教程来了解有关相关主题的更多信息: