TypeScript中是否有一种方法可以使用index types和恰好是一个通用类型声明以下接口,其中map
方法将接受与{{ 1}}的密钥而不是T
?
any
同样,接口只需要接受一种通用类型。以下是可能的解决方案,但是由于采用两种通用类型,因此无法解决此问题:
interface Foo<T> {
key: keyof T;
map: (value: any) => any;
}
答案 0 :(得分:1)
您可以使用映射类型来生成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
};