泛型类型作为函数返回类型

时间:2020-08-05 13:19:31

标签: typescript generics types

说我有一些如下代码:

function add<T extends boolean>(n1: number, n2: number, showResult: T): L<T> {
  if (showResult) {
    console.log(n1 + n2)
    return undefined // Type 'undefined' is not assignable to type 'L<T>'.(2322)
  } else {
    return n1 + n2 // Type 'number' is not assignable to type 'L<T>'.(2322)
  }
}

type L<G extends boolean> = G extends true ? undefined : number

type K = L<true> // K: undefined

const result = add(1, 2, false) // result: number

add函数的返回类型取决于showResult,因此我引入了通用类型参数T和通用类型L。我对为什么有两个错误表示undefinednumber都不能分配给类型L<T>感到困惑。

如何消除这些错误,同时还能推断出result类型?

谢谢。

1 个答案:

答案 0 :(得分:0)

您的类型签名表明调用方可以传递扩展布尔值的任何类型,并且您的函数将返回该类型的L参数化的 undefined不是“ L由调用者传递的任何类型的参数化,扩展了布尔值。” (确实,布尔值在这里有点神奇,在实践中可能无法扩展它,但是您的签名表明您期望它是。)

虽然我根本不会特别推荐此功能(传递布尔值通常是设计问题的征兆,并且您确实应该只有两个功能),但是如果要实现它,我建议重载:

function add(n1: number, n2: number, showResult: true): undefined
function add(n1: number, n2: number, showResult: false): number
function add(n1: number, n2: number, showResult: boolean): number | undefined
{
    // Implementation
}

这表示如果传递一个布尔值,它将返回一个数字或未定义,但是如果在编译时已知它为true,则它将是未定义的;如果已知为false,则它将是一个数字。 / p>