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

tsh*_*tsh 2 constructor typescript

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

class MyClass {
  someField: boolean;
  constructor() {
    return { someField: true };
  }
}
Run Code Online (Sandbox Code Playgroud)

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


(属性)MyClass.someField:布尔值

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

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

GMK*_*ain 13

解决方案1

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

someField!:string;
Run Code Online (Sandbox Code Playgroud)

解决方案2

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

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

Run Code Online (Sandbox Code Playgroud)

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


Tit*_*mir 8

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

初始化字段

如果在定义属性时将属性定义为boolean应有的属性,true或者false在声明该字段或在构造函数中对其进行初始化时,将其初始化:

class MyClass {
  someField: boolean = false;
  constructor() {
    return { someField: true };
  }
}
Run Code Online (Sandbox Code Playgroud)

将字段设为可选

如果该字段可以是undefined,则应在字段声明中将此字段标记为,方法是使用?或将字段键入为undefined|boolean

class MyClass {
    //someField?: boolean;
    someField: boolean | undefined;
    constructor() {
        return { someField: true };
    }
}
Run Code Online (Sandbox Code Playgroud)

使用一个非空的断言

在您的情况下,由于实际上不是在构造函数中初始化当前对象(this),而是返回一个新的对象,因此可以告诉编译器该错误是错误的,并使用一个非null的断言。专门引入此断言是因为strictPropertyInitialization检查有局限性,有时编译器会把它弄错。在这种情况下,您可以覆盖编译器的想法,但您必须明确说明一下:

class MyClass {
    someField!: boolean;
    constructor() {
        return { someField: true };
    }
}
Run Code Online (Sandbox Code Playgroud)


Olu*_*oba 5

"angularCompilerOptions": {
    //   ...
    "strictPropertyInitialization": false
    //   ...   }
Run Code Online (Sandbox Code Playgroud)

根据 Angular 最新版本,它支持严格输入,因此您必须禁用它。

进行修改并重启服务器

  • 这个问题与角度无关,也不涉及任何“服务器” (3认同)