首页 > 解决方案 > TypeScript 通过返回构造对象抱怨构造函数“没有初始化程序,并且没有在构造函数中明确分配”

问题描述

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

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

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


(属性)MyClass.someField:布尔值

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

给定的代码片段是从我的原始脚本中简化的。我想返回构造的值,而不是在构造函数中为 this 赋值。我应该怎么做才能使 TypeScript 正常工作而没有提到的错误?

标签: typescriptconstructor

解决方案


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)而是返回一个新对象,因此您可以告诉编译器该错误是错误的并使用非空断言。之所以专门引入此断言,是因为检查存在限制strictPropertyInitialization,有时编译器会出错。对于这些情况,您可以覆盖编译器的想法,但您必须明确说明:

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

推荐阅读