TypeScript函数返回类型推断结果不一致的疑问
TypeScript函数返回类型推断结果不一致的疑问
嗨,我完全懂你这种困惑——这俩函数看起来逻辑上都是在判断表单状态,应该都返回布尔值才对,但TypeScript的类型推断在这里确实藏了个小细节,咱们一步步理清楚:
先看第一个函数的代码:
// 推断类型为 () => boolean | "" const isFormValid = () => { return jobTitle && jobTitle !== '' }
问题出在&&运算符的行为上:在JavaScript/TypeScript里,&&是短路求值的逻辑与——如果左边的表达式是「真值」,就返回右边表达式的值;如果左边是「假值」,直接返回左边的假值本身。
因为jobTitle是字符串类型:
- 当
jobTitle是非空字符串时,它是真值,所以表达式会执行右边的jobTitle !== '',返回布尔值true; - 当
jobTitle是空字符串时,它是假值,表达式直接返回jobTitle本身也就是空字符串"",而不是布尔值false。
所以TypeScript就推断这个函数的返回类型是boolean | "",因为它可能返回布尔值,也可能返回空字符串。
再看第二个函数:
// 推断类型为 () => boolean const isFormInvalid = () => { return !jobTitle || jobTitle === '' }
这里的||同样是短路求值,但不管哪一部分,返回的都是布尔值:
!jobTitle:对字符串取反,结果必然是布尔值(非空字符串取反是false,空字符串取反是true);jobTitle === '':这是严格相等判断,结果也是布尔值。
所以不管||的哪一侧生效,整个表达式的结果都是布尔值,TypeScript自然就推断返回类型是boolean了。
如果想让第一个函数也返回布尔类型,有几种简单的方式:
- 直接简化逻辑:
return jobTitle !== ''(和原逻辑等价,因为非空字符串时jobTitle !== ''是true,空字符串时是false); - 用双重取反强制转布尔:
return !! (jobTitle && jobTitle !== ''); - 明确指定返回类型:
const isFormValid = (): boolean => { ... }。
备注:内容来源于stack exchange,提问作者snippetkid
相关产品推荐
相关产品推荐

