typescript - 函数参数类型推断和条件类型

我试图涵盖以下案例:

我有一个接受布尔值并返回 RealItem | ImaginaryItem 类型的 value 的函数。我正在使用条件类型来缩小基于 boolean 参数的返回类型。

type RealItem = { color: string }
type ImaginaryItem = { description: string }

export function createItem<T extends boolean>(isReal: T): T extends true ? RealItem : ImaginaryItem

export function createItem<T extends boolean>(isReal: T): RealItem | ImaginaryItem {
  return isReal ? { color: 'red' } : { description: 'Crazy thing' }
}

我的签名似乎适用于以下情况:

const a = createItem(true)      | typeof a -> RealItem
const b = createItem(false)     | typeof b -> ImaginaryItem


let isReal = true
const a = createItem(isReal)    | typeof a -> RealItem

let isReal = false
const b = createItem(isReal)    | typeof b -> ImaginaryItem

但是,如果我将 createItem 包装到另一个函数中并传递 isReal 参数:

const itemsFactory = (isReal: boolean) => createItem(isReal)

TS 似乎无法扣除条件返回类型缩小的返回类型:

const a = itemsFactory(true)    | typeof a -> RealItem | ImaginaryItem
const b = itemsFactory(false)   | typeof b -> RealItem | ImaginaryItem

https://www.typescriptlang.org/play?#code/LAKFBcE8AcFMAIBKsCGAbAkuWBbeBeeAb3gGMB7NcgJwC54BncagSwDsBzeAXwhgQw4UHdimqQsuAsXgATWA1Kto4FuTb0mrTj1ChYAD2g1w8AGYBXNqVXqy1VNkk4APABV4h7G1kN4AI3JKVDYAPgAKFgZkdHo3AEo4zwNvX3hmCwQAfiRUTGw8ekFhUXFnfSMTcysbNTZ7R1hnd2TUv0DglDDI6Ly4xNz0Z3gAH3hikTYxCQLiUHh4B3ALanqomLR4HJIKKjp4AHIHWQOeeHoSeUVlWw1DgGFqFAAvSHSAC3YOU94QX9AAPQAwb5XCgChsJjwFAARmkSkaznCGVg8XB6ih-jhhARKCcBWR1EyaLAICBIOGYwmpRmYJAEKhKAATNIeht6B00CF4gRQg08U0Ces8iSGaZ-CzCMzCcTQEA

我不会撒谎,工会类型让我很不开心。

  • 这是类型干扰中 TS 能力的某种限制吗?
  • 我可以帮助 TS 了解如何解释更高的函数参数吗?

我知道我可以在这里使用类型保护,但是它们不适合我当前的代码结构。