首页 > 解决方案 > [keyof T] 在类型定义中的右大括号之后是什么意思?

问题描述

查看此 URL https://www.typescriptlang.org/docs/handbook/advanced-types.html上的 Typescript 文档

type FunctionPropertyNames<T> = {
  [K in keyof T]: T[K] extends Function ? K : never;
}[keyof T];

有人可以向我解释一下右括号后的 [keyof T] 是什么意思吗?这种语法有任何文档吗?

标签: typescript

解决方案


这就是所谓的“查找类型”。

  1. keyof X返回一个类型的所有键

  2. 如果

    interface a {
       foo: never
       bar: string
       baz: number
    }

那么type not_here = a['foo']将是never

但是查找类型也支持传入keyof Something,所以

a[keyof a]将是所有类型的as 键/属性的联合,即never | string | number. 虽然never那里没有任何意义,所以 TS 会自动忽略它,导致string | number.

(当然可以a[keyof b],这里没有限制)

我发现找出像这样的复杂类型的最佳方法是像我在这里所做的那样按步骤分解它们:

interface test {
    a: string
    b: () => void
    c: () => void
}

type T_A<T> = {
  [K in keyof T]: T[K]
};

type T_B<T> = {
  [K in keyof T]: T[K] extends Function ? K : never;
};

type T_C<T> = {
  [K in keyof T]: T[K] extends Function ? K : never;
}[keyof T];

type a = T_A<test>
type b = T_B<test>
type c = T_C<test>

有了这个,您可以看到为获得所需结果所采取的各个步骤,即“函数类型的键的联合”。


推荐阅读