如何使泛型成为 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> {
}
但它在类型定义中显示错误:
有办法解决这个问题吗?
您似乎缺少对类型参数 K
的约束。由于您将它传递给 Record
并且 K 可能是一个枚举,因此您可以说 K
extends string
.
type Vault<K extends string, V> = Record<K, V> & VaultMethods;
我想声明一对单身人士 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
上实现它 这就是我想要的
现在,我想把它改成一个服务(所以是 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> {
}
但它在类型定义中显示错误:
有办法解决这个问题吗?
您似乎缺少对类型参数 K
的约束。由于您将它传递给 Record
并且 K 可能是一个枚举,因此您可以说 K
extends string
.
type Vault<K extends string, V> = Record<K, V> & VaultMethods;