严格布尔表达式
禁止在布尔表达式中使用某些类型。
禁止在需要布尔值的表达式中使用非布尔值类型。boolean
和 never
类型始终允许。可以通过选项配置在布尔值上下文中被认为安全的其他类型。
以下节点被认为是布尔值表达式,并检查其类型
- 逻辑否定运算符 (
!arg
) 的参数。 - 条件表达式 (
cond ? x : y
) 中的条件。 if
、for
、while
和do-while
语句的条件。- 逻辑二元运算符 (
lhs || rhs
和lhs && rhs
) 的操作数。- 当右侧操作数不是另一个布尔值表达式的后代时,它会被忽略。这是为了允许使用布尔值运算符来实现其短路行为。
module.exports = {
"rules": {
"@typescript-eslint/strict-boolean-expressions": "error"
}
};
在游乐场中尝试此规则 ↗
示例
- ❌ 错误
- ✅ 正确
// nullable numbers are considered unsafe by default
let num: number | undefined = 0;
if (num) {
console.log('num is defined');
}
// nullable strings are considered unsafe by default
let str: string | null = null;
if (!str) {
console.log('str is empty');
}
// nullable booleans are considered unsafe by default
function foo(bool?: boolean) {
if (bool) {
bar();
}
}
// `any`, unconstrained generics and unions of more than one primitive type are disallowed
const foo = <T>(arg: T) => (arg ? 1 : 0);
// always-truthy and always-falsy types are disallowed
let obj = {};
while (obj) {
obj = getObj();
}
在游乐场中打开// nullable values should be checked explicitly against null or undefined
let num: number | undefined = 0;
if (num != null) {
console.log('num is defined');
}
let str: string | null = null;
if (str != null && !str) {
console.log('str is empty');
}
function foo(bool?: boolean) {
if (bool ?? false) {
bar();
}
}
// `any` types should be cast to boolean explicitly
const foo = (arg: any) => (Boolean(arg) ? 1 : 0);
在游乐场中打开选项
此规则接受以下选项
type Options = [
{
allowAny?: boolean;
allowNullableBoolean?: boolean;
allowNullableEnum?: boolean;
allowNullableNumber?: boolean;
allowNullableObject?: boolean;
allowNullableString?: boolean;
allowNumber?: boolean;
allowRuleToRunWithoutStrictNullChecksIKnowWhatIAmDoing?: boolean;
allowString?: boolean;
},
];
const defaultOptions: Options = [
{
allowString: true,
allowNumber: true,
allowNullableObject: true,
allowNullableBoolean: false,
allowNullableString: false,
allowNullableNumber: false,
allowNullableEnum: false,
allowAny: false,
allowRuleToRunWithoutStrictNullChecksIKnowWhatIAmDoing: false,
},
];
allowString
允许在布尔值上下文中使用 string
。这是安全的,因为字符串只有一个假值 (""
)。如果希望使用显式的 str != ""
或 str.length > 0
样式,请将其设置为 false
。
allowNumber
允许在布尔值上下文中使用 number
。这是安全的,因为数字只有两个假值 (0
和 NaN
)。如果希望使用显式的 num != 0
和 !Number.isNaN(num)
样式,请将其设置为 false
。
allowNullableObject
允许在布尔上下文中使用object | function | symbol | null | undefined
。这是安全的,因为对象、函数和符号没有假值。如果更喜欢显式的obj != null
风格,请将其设置为false
。
allowNullableBoolean
允许在布尔上下文中使用boolean | null | undefined
。这是不安全的,因为可空布尔值可以是false
或空值。如果要强制使用显式的bool ?? false
或bool ?? true
风格,请将其设置为false
。如果不在意将false隐式地与空值相同对待,请将其设置为true
。
allowNullableString
允许在布尔上下文中使用string | null | undefined
。这是不安全的,因为可空字符串可以是空字符串或空值。如果不在意将空字符串隐式地与空值相同对待,请将其设置为true
。
allowNullableNumber
允许在布尔上下文中使用number | null | undefined
。这是不安全的,因为可空数字可以是假值数字或空值。如果不在意将零或NaN隐式地与空值相同对待,请将其设置为true
。
allowNullableEnum
允许在布尔上下文中使用enum | null | undefined
。这是不安全的,因为可空枚举可以是假值数字或空值。如果不在意将值为零的枚举隐式地与空值相同对待,请将其设置为true
。
allowAny
允许在布尔上下文中使用any
。出于显而易见的原因,这是不安全的。请自行承担风险将其设置为true
。
allowRuleToRunWithoutStrictNullChecksIKnowWhatIAmDoing
如果将此设置为false
,则该规则将对每个tsconfig.json
中没有将strictNullChecks
编译器选项(或strict
)设置为true
的文件报错。
在没有strictNullChecks
的情况下,TypeScript 基本上会从类型中删除undefined
和 null
。这意味着当此规则检查变量的类型时,它将无法判断该变量可能是null
还是 undefined
,这实际上会使此规则的用处大大降低。
您应该使用strictNullChecks
来确保代码库中的完全类型安全。
如果由于某种原因您无法启用strictNullChecks
,但仍然想使用此规则 - 您可以使用此选项来允许它 - 但请注意,在编译器选项关闭的情况下,此规则的行为是未定义的。如果您使用此选项,我们将不接受错误报告。
修复和建议
此规则为布尔上下文中的特定类型提供以下修复和建议
boolean
- 始终允许 - 无需修复。string
- (当allowString
为false
时) - 提供以下建议- 将条件更改为检查字符串的长度 (
str
→str.length > 0
) - 将条件更改为检查空字符串 (
str
→str !== ""
) - 将值显式转换为布尔值 (
str
→Boolean(str)
)
- 将条件更改为检查字符串的长度 (
number
- (当allowNumber
为false
时)- 对于
array.length
- 提供自动修复- 将条件更改为检查 0 (
array.length
→array.length > 0
)
- 将条件更改为检查 0 (
- 对于其他数字值 - 提供以下建议
- 将条件更改为检查 0 (
num
→num !== 0
) - 将条件更改为检查 NaN (
num
→!Number.isNaN(num)
) - 将值显式转换为布尔值 (
num
→Boolean(num)
)
- 将条件更改为检查 0 (
- 对于
object | null | undefined
- (当allowNullableObject
为false
时) - 提供自动修复- 将条件更改为检查 null/undefined (
maybeObj
→maybeObj != null
)
- 将条件更改为检查 null/undefined (
boolean | null | undefined
- 提供以下建议- 将 nullish 值显式地视为与 false 相同 (
maybeBool
→maybeBool ?? false
) - 将条件更改为检查 true/false (
maybeBool
→maybeBool === true
)
- 将 nullish 值显式地视为与 false 相同 (
string | null | undefined
- 提供以下建议- 将条件更改为检查 null/undefined (
maybeStr
→maybeStr != null
) - 将 nullish 值显式地视为与空字符串相同 (
maybeStr
→maybeStr ?? ""
) - 将值显式转换为布尔值 (
maybeStr
→Boolean(maybeStr)
)
- 将条件更改为检查 null/undefined (
number | null | undefined
- 提供以下建议- 更改条件以检查 null/undefined (
maybeNum
→maybeNum != null
) - 显式地将 nullish 值视为 0 (
maybeNum
→maybeNum ?? 0
) - 显式地将值转换为布尔值 (
maybeNum
→Boolean(maybeNum)
)
- 更改条件以检查 null/undefined (
any
和unknown
- 提供以下建议- 显式地将值转换为布尔值 (
value
→Boolean(value)
)
- 显式地将值转换为布尔值 (
何时不使用它
如果您的项目不太可能因逻辑条件中使用非布尔值的假值而出现错误,您可以跳过启用此规则。
否则,此规则在逻辑检查中要求精确比较方面可能非常严格。如果您更喜欢简洁的检查而不是更精确的布尔逻辑,此规则可能不适合您。
相关
- no-unnecessary-condition - 类似的规则,报告条件中始终为真和始终为假的 value
类型检查的 lint 规则比传统的 lint 规则更强大,但也需要配置 类型检查的 lint。如果您在启用类型检查的规则后遇到性能下降,请参阅 性能故障排除。