打字稿:在类的接口中重用属性

时间:2020-03-23 04:40:44

标签: typescript

我正在尝试使用一种简单的模式来创建“值”对象的类型。要实例化它,应在构造函数中指定所有属性。

为避免重复属性列表,我尝试过类似以下操作:

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不允许这样做,因为它要求接口中的所有属性也必须存在于类中。

是否有一种简单的方法可以消除重复属性的需要?

1 个答案:

答案 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.entriesObject.keys遍历属性或直接使用Object.assign设置值是危险的。 TypeScript不会保护您免受以下代码的攻击。<​​/ p>

const properties = { id: 1, title: '', func: null };
const cls = new VideoCl(properties);
cls.func(); // Runtime error