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]
来推断呢?
答案 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