我可以基于枚举定义接口吗?

时间:2019-01-13 17:59:59

标签: typescript

我有一个用于创建类型的枚举:

export enum MyTypeEnum {
    one = 'one',
    two = 'two',
    three = 'three',
    four = 'four'
}

export type MyTypeKeyFunctionValue = { [key in MyTypeEnum ]?: Function };
export type MyTypeKeyStringValue = { [key in MyTypeEnum ]?: string };

我有一个包含使用这些确切键的getter的类:

export class MyClass {

    get one() { ... implementation ...}
    get two() { ... implementation ...}
    get three() { ... implementation ...}
    get four() { ... implementation ...}
}

我想知道是否有一种方法可以创建一个接口,该接口在实施时会强制类具有这些吸气剂。

我尝试过

interface IClass{
  [key in MyTypeEnum ] : Function
}

但是它不起作用。这可能吗?

1 个答案:

答案 0 :(得分:3)

这些吸气剂在类public API中仅表示为属性,因此将强制实现者具有这些属性吸气剂的接口等效于:

interface MyTypeKeyGetters = {
  readonly one: any;
  readonly two: any;
  readonly three: any;
  readonly four: any;
} 

您可以基于枚举构建此类,并直接实现它:

export enum MyTypeEnum {
    one = 'one',
    two = 'two',
    three = 'three',
    four = 'four'
}

export type MyTypeKeyGetters = {
  readonly [key in MyTypeEnum]: any
};

export class MyClass implements MyTypeKeyGetters{

  get one() { return ""; }
  get two() { return ""; }
  get three() { return ""; }
  get four() { return ""; } // error if we omit one. 
}

注意:无法保证使用getter实现字段,实现类也可以使用字段。

尽管它实际上不是接口,但可以将其实现为一个接口。接口不直接支持映射的类型语法。如果要具有接口而不是类型别名,则可以定义扩展映射类型的接口:

type MyTypeKeyGetters = {
  readonly [key in MyTypeEnum]: any
};
export interface MyTypeKeyGettersInterface extends MyTypeKeyGetters { }