TypeScript在此代码示例中显示以下错误消息:
class MyClass {
someField: boolean;
constructor() {
return { someField: true };
}
}
属性'someField'没有初始化程序,并且在构造函数中未明确分配。
(属性)MyClass.someField:布尔值
TypeScript Playground(您需要启用strictNullChecks
和strictPropertyInitialization
才能看到此错误消息。)
我的原始脚本简化了给出的代码段。我想返回构造的值,而不是在构造函数中给它赋值。我该怎么办才能使TypeScript正常工作而不会出现错误?
答案 0 :(得分:9)
解决方案 1
在名称后添加 (!) 符号:
someField!:string;
解决方案 2
打开 TypeScript 配置文件
tsconfig.json
并将此代码添加到编译器选项
"angularCompilerOptions": {
// ...
"strictPropertyInitialization": false
// ...
}
注意:它会使静态分析变弱
答案 1 :(得分:4)
strictPropertyInitialization
强制您初始化所有在类的构造函数中不是可选的属性。此检查很有用,因为它可以确保您不会获得意外的未初始化属性。可以通过多种方法来解决该错误,前两种是解决该错误的一般方法,在您的情况下,仅适用最后一种(出于完整性考虑,我将所有内容都包括在内)
初始化字段
如果将属性定义为boolean
,则应在声明字段或在构造函数中对其进行初始化时将其初始化为true
或false
:
class MyClass {
someField: boolean = false;
constructor() {
return { someField: true };
}
}
使字段为可选
如果该字段可以为undefined
,则应使用?
或将字段键入为undefined|boolean
class MyClass {
//someField?: boolean;
someField: boolean | undefined;
constructor() {
return { someField: true };
}
}
使用非空断言
在您的情况下,由于实际上在构造函数中您不是在初始化当前对象(this
),而是返回一个新的对象,因此可以告诉编译器关于错误的信息是错误的,并可以使用一个非null的断言。专门引入此断言是因为strictPropertyInitialization
检查中存在局限性,有时编译器将其弄错了。在这种情况下,您可以覆盖编译器的想法,但必须对此进行明确说明:
class MyClass {
someField!: boolean;
constructor() {
return { someField: true };
}
}
答案 2 :(得分:3)
"angularCompilerOptions": {
// ...
"strictPropertyInitialization": false
// ... }
根据angular最新版本,它支持严格输入,所以你必须禁用它。
修改并重启服务器
答案 3 :(得分:1)
它将{someField:true}视为新对象,并且someField属性尚未初始化。在构造函数内部返回的目的是什么?您可以将其替换为this.someField = true
。
编辑:实际上,我调试了更多信息,请尝试在编译器选项中添加“ strictPropertyInitialization”:false,然后进行检查。但是它推翻了类型严格性(TS的美丽特性)。但我认为不要这样做。进一步了解info。