说我有一些如下代码:
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
。我对为什么有两个错误表示undefined
和number
都不能分配给类型L<T>
感到困惑。
如何消除这些错误,同时还能推断出result
类型?
谢谢。
答案 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>