如何在 Typescript 中使用带有 Object.assign 的 stringPropertyInitialization

How to use stringPropertyInitialization with Object.assign in Typescript

我有一个class喜欢

export class Config{

    public doSomething: boolean;
    public doSomethingOptionally?: boolean

    constructor(data: {
        doSomething: boolean,
        doSomethingOptionally?: boolean
    }) {
        Object.assign(this, data);
    }
}

以这种方式将数据传递给构造函数非常简单,而且 IntelliSense 足够智能,不允许开发人员在不指定 doSomething 属性 的情况下创建 Config class 的新实例,但它没有 doSomethingOptionally.

所有这一切都很好,但是一旦我在 tsconfig.json 中启用 strictPropertyInitialization,我就会收到一堆错误,因为 doSomething 没有被初始化。

最好的解决方法是什么?

我不想:

  1. 指定默认值(对象可以非常大)
  2. 使用doSomething: boolean = {} as any;
  3. data 之外的构造函数中赋值 属性 因为可能有很多参数并且调用构造函数对我来说太难看了
  4. 使doSomething接受未定义的值

一个解决方案是让编译器知道通过 Object.assign 使用 definite assignment assertion

初始化了哪些属性
export class Config{

    public doSomething!: boolean;
    public doSomethingOptionally?: boolean

    constructor(data: {
        doSomething: boolean,
        doSomethingOptionally?: boolean
    }) {
        Object.assign(this, data);
    }
}