两个泛型函数都传递了相同的参数,但计算结果不同,为什么 [英] Two generic functions, both passed in the same parameter but evaluated differently, why

查看:0
本文介绍了两个泛型函数都传递了相同的参数,但计算结果不同,为什么的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有以下泛型函数代码:

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!

Playground link

这篇关于两个泛型函数都传递了相同的参数,但计算结果不同,为什么的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆