例如:
interface Foo {
a: string
b: string
c: number
}
如何定义KeysOf<T, V>
,使KeysOf<Foo, string>
给出"a" | "b"
,而KeysOf<Foo, number>
给出"c"
?
我尝试了type KeysOf<T, V> = T[infer K] extends V ? K : never
,但是TypeScript不允许infer
的左操作数上的extends
。
答案 0 :(得分:1)
您可以使用映射类型和条件类型来做到这一点:
interface Foo {
a: string
b: string
c: number
}
type KeyOf<T, V> = {
[P in keyof T]: T[P] extends V ? P : never
}[keyof T]
type S = KeyOf<Foo, string> //"a" | "b"
type N = KeyOf<Foo, number> //"c"