【发布时间】: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 上实现它这就是我想要的
现在,我想把它改成一个服务(所以是一个类),因为它更容易测试,而且我还需要一些方法。
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<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> {
}
有没有办法解决这个问题?
【问题讨论】:
-
更新您的打字稿游乐场链接:最后两个实际上并未显示您正在使用的代码。
-
@Terry sorry 看起来我打破了帖子文本限制。我只是让“最新”的。
标签: typescript typescript-generics