TypeScript通过返回构造对象来抱怨“没有初始化程序,并且在构造函数中未明确分配”

时间:2019-01-09 06:14:08

标签: typescript constructor

TypeScript在此代码示例中显示以下错误消息:

class MyClass {
  someField: boolean;
  constructor() {
    return { someField: true };
  }
}
  

属性'someField'没有初始化程序,并且在构造函数中未明确分配。   


  (属性)MyClass.someField:布尔值

TypeScript Playground(您需要启用strictNullChecksstrictPropertyInitialization才能看到此错误消息。)

我的原始脚本简化了给出的代码段。我想返回构造的值,而不是在构造函数中给它赋值。我该怎么办才能使TypeScript正常工作而不会出现错误?

4 个答案:

答案 0 :(得分:9)

解决方案 1

在名称后添加 (!) 符号:

someField!:string;

解决方案 2

打开 TypeScript 配置文件 tsconfig.json 并将此代码添加到编译器选项

 "angularCompilerOptions": {
    //   ...
    "strictPropertyInitialization": false
    //   ...
  }

注意:它会使静态分析变弱

答案 1 :(得分:4)

strictPropertyInitialization强制您初始化所有在类的构造函数中不是可选的属性。此检查很有用,因为它可以确保您不会获得意外的未初始化属性。可以通过多种方法来解决该错误,前两种是解决该错误的一般方法,在您的情况下,仅适用最后一种(出于完整性考虑,我将所有内容都包括在内)

初始化字段

如果将属性定义为boolean,则应在声明字段或在构造函数中对其进行初始化时将其初始化为truefalse

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