我正在尝试使用一种简单的模式来创建“值”对象的类型。要实例化它,应在构造函数中指定所有属性。
为避免重复属性列表,我尝试过类似以下操作:
interface Video {
id: number;
title: string;
}
class VideoCl implements Video {
constructor(properties: Video) {
for(const [k, v] of Object.entries(properties)) {
this[k] = v;
}
}
}
不幸的是,Typescript不允许这样做,因为它要求接口中的所有属性也必须存在于类中。
是否有一种简单的方法可以消除重复属性的需要?
答案 0 :(得分:1)
您可以通过将declaration merging与相同名称的接口一起使用来完成此操作。 请记住,这样做实际上是在欺骗TypeScript。即使接口中声明的属性丢失,TypeScript也不会在意。
interface VideoCl extends Video { }
class VideoCl {
constructor(properties: Video) {
for(const [k, v] of Object.entries(properties)) {
this[k] = v;
}
}
}
与此相关,在类上使用Object.entries
,Object.keys
遍历属性或直接使用Object.assign
设置值是危险的。 TypeScript不会保护您免受以下代码的攻击。</ p>
const properties = { id: 1, title: '', func: null };
const cls = new VideoCl(properties);
cls.func(); // Runtime error