具有索引类型 属性 和方法的通用接口
Generic interface with index-type property and method
在 TypeScript 中有没有一种方法可以使用 index types 和 一个泛型类型 来声明以下接口,其中 map
方法将接受与 T
的密钥类型相同,而不是 any
?
interface Foo<T> {
key: keyof T;
map: (value: any) => any;
}
同样,接口只需要接受一种泛型类型。以下是一个可能的解决方案,但没有解决这个问题,因为它采用了两种泛型类型:
interface Foo<T, K extends keyof T> {
key: K;
map: (value: T[K]) => any;
}
您可以使用映射类型生成所有 key
/map
可能性组合的并集。此联合将强制约束 map
的参数将与 T[K]
的类型相同,上下文类型也将按预期工作:
type Test = {
a: string;
b: number;
}
type Foo<T> = {
[P in keyof T]: {
key: P;
map: (value: T[P]) => any;
}
}[keyof T]
let o: Foo<Test> = {
key: "a",
map: v => v.toLocaleLowerCase() // v is string
};
let o2: Foo<Test> = {
key: "b",
map: v => v.toLocaleLowerCase() // v is number, so err
};
在 TypeScript 中有没有一种方法可以使用 index types 和 一个泛型类型 来声明以下接口,其中 map
方法将接受与 T
的密钥类型相同,而不是 any
?
interface Foo<T> {
key: keyof T;
map: (value: any) => any;
}
同样,接口只需要接受一种泛型类型。以下是一个可能的解决方案,但没有解决这个问题,因为它采用了两种泛型类型:
interface Foo<T, K extends keyof T> {
key: K;
map: (value: T[K]) => any;
}
您可以使用映射类型生成所有 key
/map
可能性组合的并集。此联合将强制约束 map
的参数将与 T[K]
的类型相同,上下文类型也将按预期工作:
type Test = {
a: string;
b: number;
}
type Foo<T> = {
[P in keyof T]: {
key: P;
map: (value: T[P]) => any;
}
}[keyof T]
let o: Foo<Test> = {
key: "a",
map: v => v.toLocaleLowerCase() // v is string
};
let o2: Foo<Test> = {
key: "b",
map: v => v.toLocaleLowerCase() // v is number, so err
};