当前位置: 代码网 > it编程>编程语言>Javascript > TypeScript类型推断的迷惑:四种函数返回值类型定义为何相同,以及联合类型场景下如何避免类型错误?

TypeScript类型推断的迷惑:四种函数返回值类型定义为何相同,以及联合类型场景下如何避免类型错误?

2025年03月30日 Javascript 我要评论
深入探讨typescript类型推断的微妙之处:四种函数返回值类型定义的等价性及联合类型下的类型安全本文深入分析typescript类型推断机制,解释看似不同的函数类型定义如何得出相同结果,并解决联合

深入探讨typescript类型推断的微妙之处:四种函数返回值类型定义的等价性及联合类型下的类型安全

本文深入分析typescript类型推断机制,解释看似不同的函数类型定义如何得出相同结果,并解决联合类型场景下的类型错误。

首先,我们观察四种getreturntype类型定义:

type getreturntype1<t> = t extends (...args: never) => infer r ? r : never;
type getreturntype2<t> = t extends (...args: never[]) => infer r ? r : never;
type getreturntype3<t> = t extends (...args: any[]) => infer r ? r : never;
type getreturntype4<t> = t extends (...args: any) => infer r ? r : never;
登录后复制

这四种类型定义都旨在从函数类型中提取返回值类型。虽然参数类型(never, never[], any[], any) 不同,但它们在类型推断中对返回值类型r的推断结果并无影响。extends关键字关注的是函数类型的结构,而非参数的具体类型。只要函数类型匹配,infer r都能正确推断出返回值类型。因此,这四种定义实际上是等价的。

接下来,我们分析一段代码,它展示了联合类型和条件类型结合时可能出现的类型错误:

type props<t extends major | rescategorylabel> = {
  labels: t[];
  setselect: (index: number, label: t extends major ? major : rescategorylabel) => void;
  xxx: any; // 省略其他属性
};

const changeselect = (
  index: number,
  label: major | rescategorylabel,
  e: react.mouseevent<htmlanchorelement> | react.touchevent<htmlanchorelement>
) => {
  setselect(index, label);
  activetabtocenter(e.currenttarget as htmlelement);
};
登录后复制

props类型定义中的setselect函数参数label的类型推断存在问题。条件类型t extends major ? major : rescategorylabel试图根据t的类型来确定label的类型。然而,由于t是major | rescategorylabel的联合类型,当t的实际类型未知时,编译器无法确定t是major还是rescategorylabel,导致label的类型推断失败。 问题并非条件类型本身,而是它在联合类型上下文中的应用。

解决方法是直接使用major | rescategorylabel作为label的类型:

type props<t extends major | rescategorylabel> = {
  labels: t[];
  setselect: (index: number, label: major | rescategorylabel) => void;
  xxx: any; // 省略其他属性
};
登录后复制

这样,setselect函数的参数类型明确,避免了类型错误,提高了代码的可读性和可维护性。 这体现了在处理联合类型时,有时需要放弃条件类型带来的精细化类型控制,以换取更清晰和安全的类型定义。

typescript类型推断的迷惑:四种函数返回值类型定义为何相同,以及联合类型场景下如何避免类型错误?

以上就是typescript类型推断的迷惑:四种函数返回值类型定义为何相同,以及联合类型场景下如何避免类型错误?的详细内容,更多请关注代码网其它相关文章!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com