两个泛型函数都传递了相同的参数,但计算结果不同,为什么 [英] Two generic functions, both passed in the same parameter but evaluated differently, why
本文介绍了两个泛型函数都传递了相同的参数,但计算结果不同,为什么的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我有以下泛型函数代码:
type Bar<T> = {bar: T}
function test1<T>(arg: T extends {foo: number} ? T : never): void {}
function test3<T>(arg: T extends {foo: number} ? Bar<T> : never): void {}
当我呼叫他们时:
test1({foo: 23}); // Good!
test3({foo: 23}); // Type 'number' is not assignable to type 'never'.
我搞混了,我的意思是test1(...)
和test3(...)
计算arg: T extends {foo: number}
的类型条件不应该都为真吗?我的意思是,它们传递给函数的参数完全相同&它们对类型的求值条件相同。
换句话说,为什么test3({foo:23})
属于never
类型的值,而不是Bar<T>
?我也希望test3({foo:23})
失败,但错误消息显示预期为{bar: number}
,为什么错误消息却抱怨never
端?
推荐答案
在我搞混了,我的意思是
test1(...)
和test3(...)
计算arg:t的类型条件不应该都将{foo:number}扩展为真吗?
test3
中,您说参数将是Bar<T>
WhenT extends {foo: number}
。因此它应该预期{bar: {foo: number}}
,因为Bar<T>
是{bar: T}
。由于您传递的内容与Bar<T>
不匹配,因此使用never
。
如果您传递给它您所说的它应该收到的内容,它就可以正常工作:
test3({bar: {foo: 23}}); // Good!
这篇关于两个泛型函数都传递了相同的参数,但计算结果不同,为什么的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文