带方括号的打字稿类型声明

时间:2020-09-25 22:56:56

标签: typescript typescript-typings

https://www.typescriptlang.org/docs/handbook/advanced-types.html#type-guards-and-differentiating-types中找到了以下代码段

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

类型声明后的[keyof T]意味着什么以及如何命名?

[keyof T]似乎也暗示了编译器的提示,FunctionalPropertyNames中的键是T的键,但是为什么编译器不能从[K in keyof T]来推断呢?

1 个答案:

答案 0 :(得分:2)

简短说明:此用法获取所有属性的所有值类型。


首先,在[]类型通过使用一个(或多个)键访问该类型而深入到该类型之后

type A = { foo: string }
type B = A['foo'] // string

第二,您在这里具有映射类型。这意味着它是一种映射某种类型的所有键,进行转换然后返回新类型的类型。

因此,让我们先来看一下这部分:

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

无论T是什么,这都会为T的所有键创建一个类型,其中每个属性的值要么是属性的名称(如果值是一个函数)要么是{{ 1}}(如果不是函数)。

这将改变这种情况:

never

进入:

type T1 = { a(): void, b: number }

但是这里所需的结果是字符串type T2 = StripNonMethods<T1> // { a: 'a', b: never } ,因为我们正在尝试获取所有作为函数的属性名称。因此,我们使用自己的键深入到此类型,该键将所有属性的所有值作为结尾与'a'的并集返回。

现在返回:

[keyof T]

而且由于 type T3 = T2[keyof T2] // 'a' | never 永远不会存在,根据定义,它被简化了并集,您将得到:

never

Playground