英文:
Confusion on inferred return type
问题
以下是翻译好的部分:
我正在使用 TypeScript,并对编译器如何不同地推断这两个函数的返回类型感到困惑。
// 这个的类型是 () => boolean | ""
const isFormValid = () => {
return jobTitle && jobTitle !== ''
}
// 这个的类型是 () => boolean
const isFormInvalid = () => {
return !jobTitle || jobTitle === ''
}
是的,jobTitle
是一个字符串,但这两个函数的返回类型都应该是 () => boolean
吗?
英文:
I was working with Typescript and got confused with how the compiler infers the return types differently for these two functions.
//this is of type () => boolean | ""
const isFormValid = () => {
return jobTitle && jobTitle!=''
}
//this is of type () => boolean
const isFormInvalid = () => {
return !jobTitle || jobTitle===''
}
Yes, jobTitle
is a string, but shouldn't both of these be of return type () => boolean
?
答案1
得分: 2
isFormValid('') === '' // true
如果您想要布尔值作为返回值,请使用两个叹号 !
:
const isFormValid = () => {
return !!jobTitle && jobTitle!=''
}
英文:
isFormValid('') === '' // true
If you want boolean as returned value use double !
:
const isFormValid = () => {
return !!jobTitle && jobTitle!=''
}
</details>
# 答案2
**得分**: 2
`a && b`返回`a`,如果它是“假值”。`0`,`null`,`undefined`和空字符串都是“假值”。
<details>
<summary>英文:</summary>
`a && b` returns `a` if it's "falsy". `0`, `null`, `undefined` and the empty string are all "falsy".
</details>
# 答案3
**得分**: 2
以下是您要的翻译内容:
这是预期的行为。为了解释,让我们从`||`运算符开始。
如果左边的值是假的,`||`会取右边的值。
```javascript
const value = false || 0 // 0
const value2 = true || 0 // true
""
也被视为假值:
const value3 = "" || "str" // "str"
而对于&&
运算符,如果左边的值是假的,它会赋予左边的值,否则赋予右边的值:
const value1 = false && "str" // false;
const value2 = true && "str" // str;
由于jobTitle
是一个string
,它也可以是""
,编译器会推断两种可能的返回值:
- 当
jobTitle
是""
时:""
- 当
jobTitle
不是""
时:jobTitle === ''
的布尔值。
英文:
It is expected behavior. For explanation, let's start with ||
operator.
||
takes the value on the right side if the value on the left is falsy.
const value = false || 0 // 0
const value2 = true || 0 // true
The ""
is also considered a falsy value:
const value3 = "" || "str" // "str"
With the &&
, it assigns the left value if it is falsy, otherwise the right one:
const value1 = false && "str" // false;
const value2 = true && "str" // str;
Since jobTitle
is a string
it can be ""
as well and compiler infers the two possible return values:
- When
jobTitle
is""
:""
- When
jobTitle
is not""
:jobTitle === ''
boolean
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论