type FunctionPropertyNames<T> = { [K in keyof T]: T[K] extends Function ? K : never }[keyof T];
我知道映射类型
{ [P in keyof T]: T[P] }
和keyof
,但它们如何一起工作并过滤never
? 最佳答案
如果从未出现在工会中,则将其从工会中删除。所以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"
你也可以听我的音频解释类似的事情。
关于typescript - typescript FunctionPropertyNames如何工作?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54210806/