值扩展为V

时间:2019-05-03 10:05:00

标签: typescript

例如:

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

1 个答案:

答案 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"