typescript - 使用 Object.assign 避免 Typescript 构造函数中的冗余
问题描述
我有一个 Typescript 应用程序,其中有很多这样的代码:
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,
}
我想删除一些样板,特别是通过将构造函数分配替换为:
Object.assign(this, input);
这保证了在构造实例上设置输入字段。然而,Typescript 似乎并没有意识到这一点的影响。它抱怨:
Property 'prop{1,2,3}' has no initializer and is not definitely assigned in the constructor.
有什么办法可以解决这个问题,还是我坚持在构造函数中重复每个属性名称?
解决方案
要抑制错误,您可以使用明确的赋值断言:
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()
行,您仍然不会收到任何警告)。
如果你真的不想声明,你可以用一些类型断言实现一个类工厂函数,像这样
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
推荐阅读
- android - 解决 Android Studio 中的资源链接错误
- testing - TestCafe:使用来自客户端的数据生成测试?
- d3.js - 如何避免 d3.zoom 在第一次缩放或平移时翻译?
- javascript - 如何选择在 CSS Puppeteer/Node.js 中定义的图像名称?
- grafana - 从以前的安装更新 Helm Chart 中设置的变量
- perl - 是否可以在 miniperl(不是 PERL)中获取当前工作目录?
- php - 查询性能调试
- matlab - 如何避免在 Matlab 的控制台中显示任何内容?
- gmail - gmail:来自新邮件地址的第一封电子邮件回复失败
- c++ - C++ 类对象计数器作为具有静态成员的随机数