javascript 推断返回类型的混淆

euoag5mw  于 2023-05-12  发布在  Java
关注(0)|答案(3)|浏览(95)

我正在使用Typescript,并对编译器如何为这两个函数推断不同的返回类型感到困惑。

//this is of type () => boolean | ""
const isFormValid = () => {
  return jobTitle && jobTitle!=''
}

//this is of type () => boolean
const isFormInvalid = () => {
  return !jobTitle || jobTitle===''
}

是的,jobTitle是一个字符串,但是这两个字符串的返回类型不都应该是() => boolean吗?

ecbunoof

ecbunoof1#

a && b返回a,如果它是“falsy”。0nullundefined和空字符串都是“falsy”。

cpjpxq1n

cpjpxq1n2#

isFormValid('') === '' // true

如果你想要boolean作为返回值,使用double !

const isFormValid = () => {
  return !!jobTitle && jobTitle!=''
}
oxosxuxt

oxosxuxt3#

这是预期的行为。为了解释,让我们从||运算符开始。||如果左边的值为false,则取右边的值。

const value = false || 0 // 0
const value2 = true || 0 // true

""也被认为是一个假值:

const value3 = "" || "str" // "str"

对于&&,如果它是假的,则分配左边的值,否则分配右边的值:

const value1 = false && "str" // false;
const value2 = true && "str"  // str;

由于jobTitlestring,因此它也可以是"",编译器推断出两个可能的返回值:
1.当jobTitle""时:""
1.当jobTitle不是""时:jobTitle === ''boolean

相关问题