使用Object.assign避免Typescript构造函数中的冗余

使用Object.assign避免Typescript构造函数中的冗余,typescript,Typescript,我有一个Typescript应用程序,其中有很多类似这样的代码: 类模型{ prop1:字符串; prop2:字符串; prop3:字符串; 构造函数(输入:ModelInput){ this.prop1=input.prop1; this.prop2=input.prop1; this.prop3=input.prop1; } } 类型ModelInput={ prop1:字符串, 建议2:字符串, prop3:字符串, } 我想删除一些样板文件,特别是将构造函数赋值替换为: Object.

我有一个Typescript应用程序,其中有很多类似这样的代码:

类模型{
prop1:字符串;
prop2:字符串;
prop3:字符串;
构造函数(输入:ModelInput){
this.prop1=input.prop1;
this.prop2=input.prop1;
this.prop3=input.prop1;
}
}
类型ModelInput={
prop1:字符串,
建议2:字符串,
prop3:字符串,
}
我想删除一些样板文件,特别是将构造函数赋值替换为:

Object.assign(this, input);
这保证了在构造的实例上设置输入字段。然而,Typescript似乎没有意识到这一点的影响。它抱怨说:

Property 'prop{1,2,3}' has no initializer and is not definitely assigned in the constructor.

有没有办法解决这个问题,或者我一直在重复构造函数中的每个属性名称?

要抑制错误,可以使用:

或:

这取决于您希望如何将这些属性发送到JavaScript。这比手动复制所有内容少,但仍然需要在类中为输入中的每个属性声明。还要注意,如果您实际上忘记初始化属性,这些技术会抑制错误(删除
对象.assign()
行,您仍然不会收到任何警告)


如果你真的不想做任何声明,你可以用这样的方法实现一个类工厂函数

function AssignCtor<T extends object>() {
    return class {
        constructor(t: T) {
            Object.assign(this, t)
        }
    } as { new(t: T): T }
}
您可以验证它是否有效:

const model = new Model({ prop1: "hi", prop2: "okay", prop3: "bye" });
model.method(); // hi, okay, bye


要抑制错误,您可以使用:

或:

这取决于您希望如何将这些属性发送到JavaScript。这比手动复制所有内容少,但仍然需要在类中为输入中的每个属性声明。还要注意,如果您实际上忘记初始化属性,这些技术会抑制错误(删除
对象.assign()
行,您仍然不会收到任何警告)


如果你真的不想做任何声明,你可以用这样的方法实现一个类工厂函数

function AssignCtor<T extends object>() {
    return class {
        constructor(t: T) {
            Object.assign(this, t)
        }
    } as { new(t: T): T }
}
您可以验证它是否有效:

const model = new Model({ prop1: "hi", prop2: "okay", prop3: "bye" });
model.method(); // hi, okay, bye

const model = new Model({ prop1: "hi", prop2: "okay", prop3: "bye" });
model.method(); // hi, okay, bye