如何使泛型成为 Record<K,V> 的联合类型和 Typescript 中的接口?

How to make a generic type an union type of Record<K,V> and an interface in Typescript?

我想声明一对单身人士 class(Angular 服务)必须 有一些以枚举命名的成员。直到现在我把它作为一个 const:

enum RewardId {
  HEHE = 'AdMobRewardIdHEHE',
  HOHO = 'AdMobRewardIdHOHO',
}

interface RewardObject {
  id: RewardId;
  someData: any
}


const MyConst: Record<RewardId, RewardObject> = {
  [RewardId.HEHE]: {
    id: RewardId.HEHE,
    someData: 'someData'
  },

  [RewardId.HOHO]: {
    id: RewardId.HOHO,
    someData: 'someData'
  }
}

如果我添加一个新的 RewardId Typescript 让我知道我必须在 MyConst 上实现它 这就是我想要的

[打字稿游乐场link][2]

现在,我想把它改成一个服务(所以是 class),因为它更容易测试,我也需要一些方法。

interface VaultMethods {
   someMethod1(): void;
  someMethod2(): void;
}

class MyClass implements Record<RewardId, RewardObject>, VaultMethods {
  [RewardId.HEHE] = {
    id: RewardId.HEHE,
    someData: 'someData'
  };

  [RewardId.HOHO] = {
    id: RewardId.HOHO,
    someData: 'someData'
  };

  someMethod1() { }

  someMethod2() { }
}

[打字稿游乐场][3]

作为最后一步,我需要这个来转换通用接口中的 class 定义:

这不起作用 interface Vault<K, V> extends VaultMethods, Record<K, V> 因为 An interface can only extend an object type or intersection of object types with statically known members.

如果我把它变成一个类型,它就会按照 Typescript 要求我实现方法和成员的方式工作

type Vault<K, V> = Record<K, V> & VaultMethods;
class MyClass2 implements Vault<RewardId, RewardObject> {

}

Typescript Playground

但它在类型定义中显示错误:

有办法解决这个问题吗?

您似乎缺少对类型参数 K 的约束。由于您将它传递给 Record 并且 K 可能是一个枚举,因此您可以说 K extends string.

type Vault<K extends string, V> = Record<K, V> & VaultMethods;

typescript playground