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/

10-09 23:31