【问题标题】:How to make a generic type an union type of Record<K,V> and an interface in Typescript?如何使泛型类型成为 Record<K,V> 的联合类型和 Typescript 中的接口?
【发布时间】:2020-04-23 19:07:50
【问题描述】:

我想声明一个必须有一些以枚举命名的成员的单例类(Angular 服务)。直到现在我把它当作一个常量:

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 上实现它这就是我想要的

[Typescript Playground 链接][2]

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

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]

作为最后一步,我需要在通用接口中转换该类定义:

这不起作用interface Vault&lt;K, V&gt; extends VaultMethods, Record&lt;K, V&gt;,因为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

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

有没有办法解决这个问题?

【问题讨论】:

  • 更新您的打字稿游乐场链接:最后两个实际上并未显示您正在使用的代码。
  • @Terry sorry 看起来我打破了帖子文本限制。我只是让“最新”的。

标签: typescript typescript-generics


【解决方案1】:

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

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

typescript playground

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-02-26
    • 1970-01-01
    • 2021-06-09
    • 1970-01-01
    • 2018-09-15
    • 1970-01-01
    • 2020-12-24
    相关资源
    最近更新 更多