(打字稿)使用布尔值时,通用参数无法正确编译为条件类型

(Typescript) Generic parameter doesn't compile correctly for conditional type when boolean is used

我有以下类型 - 当定义 P 时,该函数应接受类型 P 的参数和 return 类型 P 的值。否则,它不应带任何参数和 'return' void。 由于某种原因,它不适用于布尔值和:

  1. 我不明白为什么。
  2. 有什么方法可以让它在不显式添加附加条件的情况下为布尔值工作 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

Playground