从接口扩展Typescript类

时间:2018-01-10 21:50:09

标签: typescript typescript-typings typescript-generics

如何使用Typescript中的接口属性扩展类?我意识到这必然会使财产没有初始化。

我唯一的目的是减少代码冗余。出现在界面中的属性声明将同样出现在每个类实现中。我宁愿从界面集中维护这些属性。

我想写下面的内容,但这是错误的谜语:

interface Spec {
    id: number;
}

class Model<S> {
    [K extends keyof S: string]: S[K];
}

class MyModel extends Model<Spec> {
    // id: number -- implicit
}

相反,我发现自己能够写出这个,但是没有做到这一点:

interface Spec {
    id: number;
}

class Model<S, K extends keyof S> {
    [K: string]: S[K];
}

class MyModel extends Model<Spec, keyof Spec> {
    // id: number -- implicit
}

很清楚,当我向MyModel添加implements Spec时,它无法完成这项工作:

class MyModel extends Model<Spec, keyof Spec> implements Spec {
    // id: number -- implicit
}

因为我得到错误Property 'id' is missing in type 'MyModel'

我并不担心将接口属性保留为未初始化,因为总是可以从构造函数中完成。我所处理的过多接口是更大的噩梦。

注意:我使用底层JS模块来填充规范属性,因此如果没有提供声明,编译器就不会抱怨。

1 个答案:

答案 0 :(得分:2)

您可以这样做来声明一个类包含接口的所有成员:

class MyModel {
  // usual stuff
}
interface MyModel extends Spec { /* don't need to write anything here */ }

此功能称为声明合并