type FunctionPropertyNames<T> = { [K in keyof T]: T[K] extends Function ? K : never }[keyof T];
我知道映射类型{ [P in keyof T]: T[P] }
和keyof
,但是它们如何协同工作并过滤never
?
答案 0 :(得分:1)
如果工会中从未存在过,则将其从工会中删除。因此never | "A"
就是"A"
。
鉴于此行为,我们想要构造一个映射类型,该类型具有never
作为我们不想在结果中使用的键的类型,而键的名称作为该键的类型我们想要的结果键。我们在每个属性上使用条件类型T[K] extends Function ? K : never
进行此操作。例如:
type FunctionPropertyNamesMapped<T> = { [K in keyof T]: T[K] extends Function ? K : never }
type Test = FunctionPropertyNamesMapped<{
a: number,
fn: () => {}
}>
// Test is the same as
// {
// a: never;
// fn: "fn";
//}
鉴于这种新的映射类型,如果我们得到其中所有键类型的并集(使用[keyof T]
),我们将得到并集never | "fn"
,其减少为"fn"
您也可以听我对类似here的声音的解释