打字稿FunctionPropertyNames如何工作?

时间:2019-01-16 05:14:46

标签: typescript

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

我知道映射类型{ [P in keyof T]: T[P] }keyof,但是它们如何协同工作并过滤never

1 个答案:

答案 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的声音的解释