(打字稿)使用布尔值时,通用参数无法正确编译为条件类型
(Typescript) Generic parameter doesn't compile correctly for conditional type when boolean is used
我有以下类型 - 当定义 P
时,该函数应接受类型 P
的参数和 return 类型 P
的值。否则,它不应带任何参数和 'return' void
。
由于某种原因,它不适用于布尔值和:
- 我不明白为什么。
- 有什么方法可以让它在不显式添加附加条件的情况下为布尔值工作
P extends boolean
(如此有效)。
export type Test<P = void> = P extends void
? () => void
: (payload: P) => P
const test0: Test = () => {} // compiles
const test1: Test<number> = (payload: number): number => payload // compiles
const test2: Test<boolean> = (payload: boolean): boolean => payload // doesn't compile
首先为什么:
boolean
作为 true | false
的联合分布,因此结果类型为
((payload: false) => false) | ((payload: true) => true)'
。
更多信息here
如何让它发挥作用:
只有 "naked types" 是分发的候选对象。选择退出的可能方法之一:
type Test<P = void> = [P] extends [void]
? () => void
: (payload: P) => P
我有以下类型 - 当定义 P
时,该函数应接受类型 P
的参数和 return 类型 P
的值。否则,它不应带任何参数和 'return' void
。
由于某种原因,它不适用于布尔值和:
- 我不明白为什么。
- 有什么方法可以让它在不显式添加附加条件的情况下为布尔值工作
P extends boolean
(如此有效)。
export type Test<P = void> = P extends void
? () => void
: (payload: P) => P
const test0: Test = () => {} // compiles
const test1: Test<number> = (payload: number): number => payload // compiles
const test2: Test<boolean> = (payload: boolean): boolean => payload // doesn't compile
首先为什么:
boolean
作为 true | false
的联合分布,因此结果类型为
((payload: false) => false) | ((payload: true) => true)'
。
更多信息here
如何让它发挥作用:
只有 "naked types" 是分发的候选对象。选择退出的可能方法之一:
type Test<P = void> = [P] extends [void]
? () => void
: (payload: P) => P