从接口扩展 Typescript class

Extend a Typescript class from an interface

如何使用 Typescript 中的接口属性扩展 class?我意识到这必然会使属性未初始化。

我的唯一目的是减少代码冗余。接口中出现的 属性 声明将完全相同地出现在每个 class 实现中。我宁愿只从界面集中维护这些属性。

我想写类似下面的东西,但这是错误的谜语:

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
}

很明显,当我将 implements Spec 添加到 MyModel 时它没有完成工作:

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

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

我不担心未初始化接口属性,因为这始终可以从构造函数中完成。我正在处理的过多接口是更大的噩梦。

注意:我正在使用底层 JS 模块来填充规范属性,因此如果未提供它们的声明,编译器不一定会报错。

您可以这样做来声明一个 class 具有接口的所有成员:

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

此功能称为声明合并