有没有一种方法可以获取其中interface [key]是类型的接口的键?

时间:2020-02-01 06:18:39

标签: typescript types

如果我有此界面:

interface Interface {
  a: number
  b: number
  c: string
  d: string
  e: number[]
}

Interface中值的类型为/扩展特定类型的情况下,如何获取Interface的键?就像Pick<T, K>,但不是返回与类型匹配的键,而是返回其值与类型匹配的键。

我正在寻找这样的东西:

type KeyOfWhereValueMatches<T, U extends U[keyof U]> = // ???
KeyOfWhereValueMatches<Interface, number> // 'a' | 'b'
KeyOfWhereValueMatches<Interface, string> // 'c' | 'd'
KeyOfWhereValueMatches<Interface, number[]> // 'e'

1 个答案:

答案 0 :(得分:2)

应该执行以下操作:

type KeyOfWhereValueMatches<
    T,
    U,
    S = { [key in keyof T]: U extends T[key] ? key : never; }
    > = S[keyof S]

工作原理: T是您的界面,U是您要为其获取密钥的类型。

S是通过接口类型的每个键运行的一种计算类型。如果U可分配给该键的类型(即number extends Interface[b]),则该字段的新类型是其键的字符串文字。如果没有,那就永远不会。

对于KeyOfWhereValueMatches<Interface, number>S等于:

interface S {
    a: "a";
    b: "b";
    c: never;
    d: never;
    e: never;
}

最后,S[keyof S]使用lookup types返回S中所有可用键的类型。这些将是适当键的字符串文字,或者是never。由于never不会发生,因此查找仅返回字符串文字。