Я хочу объявить пару одноэлементных классов (Angular service), которые должны иметь несколько членов, названных в честь перечисления. До сих пор у меня было это как 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
, это то, что я хочу
[Typescript Playground link] [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() { }
}
[Typescript Playground] [3]
В качестве последнего шага мне нужно преобразовать это определение класса в обобщенном c интерфейсе:
Это не работает 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> {
}
Площадка для машинописи
Но в определении типа отображается ошибка:
Есть ли способ это исправить?