函数的条件泛型类型被分解为类型的片段

时间:2019-11-26 07:34:47

标签: typescript typescript-generics conditional-types

我正在尝试编写通用条件类型。我的尝试是:

type Some<T> = T extends (...args: any[]) => any ? (p: T) => T : T | ((p: T) => T);

创建此类变量时

let v: Some<(() => void) | string | boolean>;

它的类型原来是

string | boolean | ((p: string) => string) | ((p: false) => false) | ((p: true) => true) | ((p: () => void) => () => void)

甚至boolean类型也被分解为truefalse类型。我实际上想要构建什么类型

string | boolean | ((p: string | boolean | (() => void)) => string | boolean | (() => void))

我应该怎么做?

1 个答案:

答案 0 :(得分:2)

这是因为条件类型为distributive。我不确定无法以这种方式获取您想要的类型。但是,您可以用其他方式来描述类型,例如:

type Some<T> = Exclude<T, Function> | ((p: T) => T);

至少产生的类型看起来像您期望的类型。 Playground link