我正在尝试编写通用条件类型。我的尝试是:
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
类型也被分解为true
和false
类型。我实际上想要构建什么类型
string | boolean | ((p: string | boolean | (() => void)) => string | boolean | (() => void))
我应该怎么做?
答案 0 :(得分:2)
这是因为条件类型为distributive。我不确定无法以这种方式获取您想要的类型。但是,您可以用其他方式来描述类型,例如:
type Some<T> = Exclude<T, Function> | ((p: T) => T);
至少产生的类型看起来像您期望的类型。 Playground link。