我有一个Typescript应用程序,其中有很多这样的代码:
\[((?:[+-]?)\d+\.[\d…]+,\s(?:[+-]?)\d+\.[\d…]+(?:,\s\d+\.[\d…]+)?)\]
我想删除一些样板,特别是通过将构造函数分配替换为:
class Model {
prop1: string;
prop2: string;
prop3: string;
constructor(input: ModelInput) {
this.prop1 = input.prop1;
this.prop2 = input.prop1;
this.prop3 = input.prop1;
}
}
type ModelInput = {
prop1: string,
prop2: string,
prop3: string,
}
这可确保在构造的实例上设置输入字段。但是,Typescript似乎无法识别这种效果。它抱怨:
Object.assign(this, input);
有没有解决此问题的方法,还是我在构造函数中重复了每个属性名称?
答案 0 :(得分:3)
要消除该错误,可以使用definite assignment assertions:
class ModelAssert {
prop1!: string;
prop2!: string;
prop3!: string;
constructor(input: ModelInput) {
Object.assign(this, input);
}
}
class ModelDeclare {
declare prop1: string;
declare prop2: string;
declare prop3: string;
constructor(input: ModelInput) {
Object.assign(this, input);
}
}
取决于您希望这些属性如何发射到JavaScript。这比手动复制所有内容要少,但是仍然需要在类中为输入中的每个属性声明一个声明。还要注意,如果您实际上忘记了初始化属性,则这些技术会抑制该错误(删除Object.assign()
行,您仍然不会收到警告)。
如果您真的根本不想声明,则可以使用这样的type assertions实现类工厂函数
function AssignCtor<T extends object>() {
return class {
constructor(t: T) {
Object.assign(this, t)
}
} as { new(t: T): T }
}
,然后使用它使形式的构造函数“采用T
类型的参数并返回T
类型的值”。因此Model
可能是:
class Model extends AssignCtor<ModelInput>() {
method() {
console.log(this.prop1 + ", " + this.prop2 + ", " + this.prop3);
}
}
您可以验证它是否有效:
const model = new Model({ prop1: "hi", prop2: "okay", prop3: "bye" });
model.method(); // hi, okay, bye