// code snippet
function valueOrDefault(a?: string) {
return a || "the default";
}
tslint.json
рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЗ рд╕рд╛рде:
{
"defaultSeverity": "error",
"extends": [
"tslint:all"
]
}
2 рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреА рд░рд┐рдкреЛрд░реНрдЯ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛:
strict-boolean-expressions This type is not allowed in the operand for the '||' operator because it could be undefined. Only booleans are allowed.
strict-boolean-expressions This type is not allowed in the operand for the '||' operator because it is always truthy. Only booleans are allowed.
рдХреЛрдИ рддреНрд░реБрдЯрд┐ рд░рд┐рдкреЛрд░реНрдЯ рдирд╣реАрдВ рдХреА рдЬрд╛ рд░рд╣реА рд╣реИред рдореИрдВ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд▓рд┐рдП рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рди рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддрд╛рд░реНрдХрд┐рдХ ||
рдСрдкрд░реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ (рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рдлрд╝рдВрдХреНрд╢рди рдкреИрд░рд╛рдореАрдЯрд░ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдШреЛрд╖рдгрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ, рд╕реНрдирд┐рдкреЗрдЯ рдХреЗрд╡рд▓ рд╕рд╛рдорд╛рдиреНрдп рд╕рдорд╕реНрдпрд╛ рдХреЛ рдЪрд┐рддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИ)ред рдХрд╣реАрдВ рднреА рдЦреЗрд▓рдиреЗ рдореЗрдВ рдХреЛрдИ boolean
рдирд╣реАрдВ рд╣реИ: рди рддреЛ рдЗрдирдкреБрдЯ рдФрд░ рди рд╣реА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХрд╛ рдЖрдЙрдЯрдкреБрдЯред
рд╡рд┐рдЪрд╛рд░? рдкреНрд░рд╛рд░реНрдердирд╛? рдХрд╣рд╛рдВ/рдХреИрд╕реЗ рд╢реБрд░реВ рдХрд░реЗрдВ, рдЗрд╕ рдкрд░ рд╕реБрдЭрд╛рд╡?
@marcind рдХреНрдпрд╛ рдЖрдк рдЙрджрд╛рд╣рд░рдг рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдирд┐рдпрдо рдХреЛ рдмрджрд▓рдиреЗ рд╕реЗ рдЗрд╕реЗ рдЕрд▓рдЧ рддрд░реАрдХреЗ рд╕реЗ рдХреИрд╕реЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП?
рдХреНрд╖рдорд╛ рдХрд░реЗрдВ, рдореЗрд░рд╛ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╕рдмрдорд┐рд╢рди рдХреМрди рд╕рд╛ рднрд╛рдЧ рдЕрд╕реНрдкрд╖реНрдЯ рд╣реИ?
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореЗрд░рд╛ рдореБрджреНрджрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдирд┐рдпрдо рдХреЗрд╡рд▓ "рдмреВрд▓рд┐рдпрди рд╕рдВрджрд░реНрдн" рдореЗрдВ рдЪрд▓рдирд╛ рдЪрд╛рд╣рд┐рдП, рдореИрдВ рджреЛ рдорд╛рдорд▓реЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪ рд╕рдХрддрд╛ рд╣реВрдВ:
if
, while
, рдпрд╛ for
рдореЗрдВ рдкреНрд░рдпреБрдХреНрддboolean
рд░реВрдк рдореЗрдВ рдЯрд╛рдЗрдк рдХрд┐рдП рдЧрдП рд╡реЗрд░рд┐рдПрдмрд▓ рдХреЛ рдЕрд╕рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛редрдЬрдм рдореИрдВ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рди рдпрд╛ рд╢реЙрд░реНрдЯ-рд╕рд░реНрдХрд┐рдЯ рдореВрд▓реНрдпрд╛рдВрдХрди рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рддреЛ рдирд┐рдпрдо рдирд╣реАрдВ рдЪрд▓рдирд╛ рдЪрд╛рд╣рд┐рдП
const a: string = potentiallyUndefinedString || "the default";
const a: string | undefined = potentiallyUndefinedObject && potentiallyUndefinedObject.getString()
@marcind рдЖрдкрдХреА рдкрд┐рдЫрд▓реА рдкреЛрд╕реНрдЯ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХрд╛рдо рдХрд░реЗрдВрдЧреЗ рдпрджрд┐ рдЖрдк "allow-undefined-union"
рд╡рд┐рдХрд▓реНрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред
рдЖрдкрдХреЗ рдЕрдиреБрд░реЛрдз рдХрд╛ рджреВрд╕рд░рд╛ рднрд╛рдЧ strict-boolean-conditions
рдирд╛рдордХ рдПрдХ рдЕрд▓рдЧ рдирд┐рдпрдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреЛ рдХреЗрд╡рд▓ if
, for
, while
, do ... while
рдФрд░ рд╕рд╢рд░реНрдд рдЬрд╛рдВрдЪ рдХрд░рддрд╛ рд╣реИ рднрд╛рд╡ ( x ? y : z
)ред
рдореИрдВ рдХрд▓реНрдкрдирд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рдХреЗрд╡рд▓ рдкреВрд░реА рд╕реНрдерд┐рддрд┐ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗрдЧрд╛, рди рдХрд┐ рдЗрд╕рдХреЗ рдШрдЯрдХ:
function foo(a: boolean, b?: boolean) {
if (b || a) {} // passes, result is always boolean
if (b && a) {} // fails, result is boolean | undefined
if (a || b) {} // fails, result is boolean | undefined
if (a || !!b) {} // passes
}
рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдирдП рдирд┐рдпрдо рдХреЗ рдмрдЬрд╛рдп рдореМрдЬреВрджрд╛ рдирд┐рдпрдо рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рдХрд▓реНрдк рд╣реЛ...
рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, strict-boolean-expressions
рдХреЛ рдХреЗрд╡рд▓ &&
рдФрд░ ||
рдХреЗ рдмрд╛рдПрдВ рдСрдкрд░реЗрдВрдб рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдПред рд╡реЗ рдСрдкрд░реЗрдЯрд░ рд╣реИрдВ (рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ) рдЯрд░реНрдирд░реА рдХреЗ рд▓рд┐рдП рдЪреАрдиреА: a && b
рдмрд░рд╛рдмрд░ рд╣реИ a ? b : a
, рдФрд░ a || b
рдмрд░рд╛рдмрд░ рд╣реИ a ? a : b
ред рдЬрдм рдЖрдк рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЙрди рд╢рдмреНрджреЛрдВ рдореЗрдВ рд╕реЛрдЪрддреЗ рд╣реИрдВ, рддреЛ рдЖрд░рдПрдЪрдПрд╕ рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░рдирд╛ рдмрд╣реБрдд рдорд╛рдпрдиреЗ рд░рдЦрддрд╛ рд╣реИ, рдФрд░ рдпрд╣ рд╢реЙрд░реНрдЯ-рд╕рд░реНрдХрд┐рдЯрд┐рдВрдЧ рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдЯрд░реНрдирд░реА рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗ рдЕрдиреБрд░реВрдк рд▓рд╛рдПрдЧрд╛ред
рдлрд┐рд░ , рдЕрдЧрд░ рдкреВрд░реА рдЪреАрдЬ рдЕрдЧрд░/рдХреЗ рд▓рд┐рдП/рд╕рдордп рдХреЗ рдЕрдВрджрд░ рд╣реИ, рддреЛ strict-boolean-conditions
рдЪрд▓рди рдореЗрдВ рдЖ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рд╕рдордЧреНрд░ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреА рдЬрд╛рдВрдЪ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕рдореЗрдВ рд╕рднреА рдЙрдкрдпреЛрдЧреА рдорд╛рдорд▓реЗ рд╢рд╛рдорд┐рд▓ рд╣реЛрдВрдЧреЗ, рдФрд░ рдореИрдВ рдЗрд╕ рдирд┐рдпрдо рдХреЛ рдлрд┐рд░ рд╕реЗ рдЪрд╛рд▓реВ рдХрд░ рдкрд╛рдКрдВрдЧрд╛ред
рдЬрд┐рд╕ рдХреЛрдб рдиреЗ рдЗрд╕реЗ рдореЗрд░реЗ рд▓рд┐рдП рдПрдХ рд╕рдорд╕реНрдпрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдХрд┐рдпрд╛ рдерд╛ рд╡рд╣ рдпрд╣ рджрд╕реНрддрд╛рд╡реЗрдЬ рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдкреИрдЯрд░реНрди рдерд╛ :
function Foo(props: { showToggle: boolean }) {
return <div>{props.showToggle && <Toggle />}</div>;
}
ERROR: 2:36 strict-boolean-expressions This type is not allowed in the operand for the '&&' operator because it is always truthy. Allowed types are boolean, null-union, undefined-union, string, or number.
@ajafff рдЙрдирдХрд╛ рдХреЛрдб рдореЗрд░реЗ рд▓рд┐рдП рд▓рд┐рдВрдЯрд░ рдкрд╛рд╕ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ рд╕рднреА рдирд┐рдпрдо рдХреЗ рд╡рд┐рдХрд▓реНрдк рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рдХрд╛рд░рдг, рдирд┐рд░рдВрддрд░ RHS рдХреЗ рдХрд╛рд░рдг:
export function valueOrDefault(a?: string) {
return a || "the default";
}
"strict-boolean-expressions": [true, "allow-null-union", "allow-undefined-union", "allow-string", "allow-number", "allow-mix"]
ERROR: 2:15 strict-boolean-expressions This type is not allowed in the operand for the '||' operator because it is always truthy. Allowed types are boolean, null-union, undefined-union, string, or number.
рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХрд╛ рдЗрд░рд╛рджрд╛ рдПрд▓рдПрдЪрдПрд╕ рдкрд░ рдПрдХ рд╕рд╢рд░реНрдд рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрд░рдПрдЪрдПрд╕ рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░рдиреЗ рдХрд╛ рдореЗрд░рд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рднреА рдЙрд╕рдХреА рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдХрд░реЗрдЧрд╛ред
рдореИрдВ рд╕рд╣рдордд рд╣реВрдВ рдХрд┐ &&
рдФрд░ ||
рдХреЗ рдЖрд░рдПрдЪрдПрд╕ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдирд╛ рдПрдХ рдмрдЧ рд╣реИред
рдореИрдВ &&
, ||
рдХреЗ рдПрд▓рдПрдЪрдПрд╕ рдФрд░ !
рдХреЗ рдСрдкрд░реЗрдВрдб рдХреЗ рдЪреЗрдХ рдореЗрдВ рдЫреВрдЯ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рднреА рдЗрдЪреНрдЫреБрдХ рд╣реВрдВред рдЗрдирдХреА рдХреЗрд╡рд▓ рдЬрд╛рдБрдЪ рдХреА рдЬрд╛рдиреА рдЪрд╛рд╣рд┐рдП рдХрд┐ рдХреНрдпрд╛ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╣рдореЗрд╢рд╛ рд╕рддреНрдп рд╣реИ рдпрд╛ рд╣рдореЗрд╢рд╛ рдорд┐рдереНрдпрд╛ рд╣реИред
рдпрд╣ рдХреЗрд╡рд▓ if
, for
, while
, do ... while
рдФрд░ рдХреЗрд╡рд▓ рдмреВрд▓рд┐рдпрди (рдпрд╛ рдЬреЛ рдХреБрдЫ рднреА рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ) рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдЦреНрдд рдЬрд╛рдБрдЪ рдХреЗ рд▓рд┐рдП рд╕рд╢рд░реНрдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХреА рд╢рд░реНрддреЛрдВ рдХреЛ рдЫреЛрдбрд╝ рджреЗрддрд╛ рд╣реИ ) рд╡рд┐рдЪрд╛рд░ @adidahiya?
рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЙрдкрд▓рдмреНрдз рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЗ рд╕рд╛рде рдЗрд╕ рдирд┐рдпрдо рдХреЛ рд╕рдХреНрд╖рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░реЗ рдХреЛрдб рдЖрдзрд╛рд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХреЗ рджрд┐рдиреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред :(
рдореИрдВрдиреЗ рдпрд╣ рдЙрдореНрдореАрдж рдХрд░рддреЗ рд╣реБрдП рдЗрд╕реЗ рд╕рдХреНрд╖рдо рдХрд┐рдпрд╛ рдХрд┐ рдпрд╣ number
, null
рдпрд╛ undefined
рдХреЛ boolean
рдирд┐рд╣рд┐рдд рд░реВрдкрд╛рдВрддрд░рдг рдХреЛ рд░реЛрдХ рджреЗрдЧрд╛ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:
if (!!array.length) { /* ... */ }
md5-d563d6246c0e981c16f8a2b3d7f53974
md5-430ec08bab82330fa4e519419e9ad014
However I find the following uses acceptable:
md5-70351fc6fdb328ee060919d6974e2cf4
```tsx
md5-036fd2ddd516eac8e1379cdcb9ac2b9a
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ @marcind рдХреЗ рд╕реБрдЭрд╛рд╡ рд╕реЗ рд╕рд╣рдордд
рдореИрдВ && рдХреЗ рдПрд▓рдПрдЪрдПрд╕ рдХреЗ рд▓рд┐рдП рдЪреЗрдХ рдореЗрдВ рдвреАрд▓ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рднреА рдЗрдЪреНрдЫреБрдХ рд╣реВрдВ, || рдФрд░ рдХреЗ рд╕рдВрдХрд╛рд░реНрдп!.
@ajafff рдХреНрдпрд╛ рдпрд╣ if (!!array.length)
рдпрд╛ if (!possiblyNull)
рд╡реИрдз рдХрд░реЗрдЧрд╛?
@ajafff @adidahiya рдХреЛрдИ рдФрд░ рд╡рд┐рдЪрд╛рд░ рдпрд╣рд╛рдБ? рдореИрдВ рдареАрдХ рдЙрд╕реА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╣реВрдВ рдЬреИрд╕реЗ @ rhys-vdwред
рдмреЗрд╢рд░реНрдореА рд╕реЗ рдореЗрд░реЗ рдЕрдкрдиреЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХрд╛ рд╡рд┐рдЬреНрдЮрд╛рдкрди:
рдЗрд╕ рдЕрдВрдХ рдореЗрдВ рдЕрдкрдиреА рдЖрдЦрд┐рд░реА рдЧрддрд┐рд╡рд┐рдзрд┐ рдХреЗ рдмрд╛рдж рд╕реЗ рдореИрдВрдиреЗ рдЕрдкрдирд╛ рдЦреБрдж рдХрд╛ рд▓рд┐рдВрдЯрд░, рдлрд┐рдореНрдмреБрд▓рд┐рдВрдЯрд░ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдмрдирд╛рдпрд╛ рд╣реИ ред рддреНрд╡рд░рд┐рдд рд╢реБрд░реБрдЖрдд рдХреЗ рд▓рд┐рдП рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдкрдврд╝реЗрдВ: https://github.com/fimbullinter/wotan/blob/master/packages/wotan/README.md
рдЗрд╕рдореЗрдВ рдПрдХ рдирд┐рдпрдо рд╢рд╛рдорд┐рд▓ рд╣реИ no-useless-predicate
, рдЬреЛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдЬреЛ рдЦреЛрдЬ рд░рд╣реЗ рд╣реИрдВ рд╡рд╣ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ TSLint рдХреЗ strict-type-predicates
рдФрд░ strict-boolean-expressions
рдХрд╛ рд╕рдВрдпреЛрдЬрди рд╣реИ, рд▓реЗрдХрд┐рди рдХреБрдЫ рдкреНрд░рдореБрдЦ рдЕрдВрддрд░реЛрдВ рдХреЗ рд╕рд╛рде:
TSLint рдХреЗ рд╡рд┐рдкрд░реАрдд strict-type-predicates
рднреА --strictNullChecks
рдмрд┐рдирд╛ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЯрд╛рдЗрдк рдкреИрд░рд╛рдореАрдЯрд░ рдФрд░ рдЦрд╛рд▓реА рдСрдмреНрдЬреЗрдХреНрдЯ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рд╕рдВрднрд╛рд▓рддрд╛ рд╣реИред (рд╢рд╛рдпрдж рдЗрд╕ рдореБрджреНрджреЗ рдХреА рд╕рджрд╕реНрдпрддрд╛ рд▓реЗрдиреЗ рд╡рд╛рд▓реЗ рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЗрддрдирд╛ рджрд┐рд▓рдЪрд╕реНрдк рдирд╣реАрдВ рд╣реИ)
TSLint рдХреЗ strict-boolean-expressions
рдореЗрдВ рдореБрдЦреНрдп рдЕрдВрддрд░ рдпрд╣ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдмреВрд▓рд┐рдпрди рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдм рдХреБрдЫ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ (рдпрд╣ рдирд┐рд╣рд┐рдд рдЬрдмрд░рджрд╕реНрддреА рдХрд╛ рдкрддрд╛ рдирд╣реАрдВ рд▓рдЧрд╛рддрд╛ рд╣реИ)ред рдЗрд╕рдХреЗ рд▓рд┐рдП рд╣рд░ рд╢рд░реНрдд рдХреЛ рд╕рдВрднрд╡рддрдГ рд╕рддреНрдп рдФрд░ рдорд┐рдереНрдпрд╛ рд╣реЛрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рдХреБрдЫ рдЙрджрд╛рд╣рд░рдг:
if (0) {} // error, always falsy
if (1) {} // error, always truthy
declare let array: string[];
if (array.length) {} // no error
if (!array.length) {} // no error
if (!!array.length) {} // no error
if (array.length === undefined) {} // error, condition is always false
if (!!false) {} // 2 errors, because of the double negation of an always falsy value
declare let someString: string;
return someString || 'some default string'; // no error, because 'someString' might be falsy
declare const foo: 'bar' | 'baz';
return foo || 'bas'; // error, 'foo' is always truthy
declare let optionalFunction: (() => void) | undefined;
optionalFunction && optionalFunction(); // no error
рдореИрдВ рдЕрдкрдиреЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХреЛрдб рд╕реЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдЭрдВрдХрд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ:
export interface ILoggingRule {
readonly isFinal?: boolean;
readonly loggerNamePattern?: string;
readonly maxLogLevel?: LogLevel;
readonly minLogLevel?: LogLevel;
readonly target: Target;
}
// ...
/**
* Creates an instance of LoggingRule.
* <strong i="6">@param</strong> options Configuration options of the logging rule.
*/
public constructor(options: ILoggingRule) {
// tslint:disable:strict-boolean-expressions
this.isFinal = options.isFinal || false;
this.loggerNamePattern = options.loggerNamePattern || "*";
this.maxLogLevel = options.maxLogLevel || LogLevel.Fatal;
this.minLogLevel = options.minLogLevel || LogLevel.Trace;
this.target = options.target;
// tslint:enable:strict-boolean-expressions
}
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдпрджрд┐ рдПрд▓рдПрдЪрдПрд╕ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╣реЛрддрд╛ рд╣реИ рддреЛ рдореИрдВ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рдиреЛрдВ рдХреЛ рджрд░реНрд╢рд╛рдиреЗ рдХреЗ рд▓рд┐рдП ||
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред рдХреНрдпрд╛ рдХреЛрдИ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рддрд░реАрдХрд╛ рд╣реИ рдЬреЛ tslint
рд╕рдордЭрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ strict-boolean-expressions
рдХрд╛ рдкрд╛рд▓рди рдХрд░рддрд╛ рд╣реИ? рдЕрдиреНрдпрдерд╛ рдореБрдЭреЗ рдЙрди рдЕрдХреНрд╖рдо/рд╕рдХреНрд╖рдо рдЖрджреЗрд╢реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рд╣реЛрдирд╛ рдкрдбрд╝рддрд╛ рд╣реИред (рдЖрд╢реНрдЪрд░реНрдпрдЬрдирдХ рд░реВрдк рд╕реЗ рдпрд╣ рдХреЗрд╡рд▓ рдПрдХ рд╕рдорд╕реНрдпрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдЯрд╛рдЗрдк-рдЪреЗрдХрд┐рдВрдЧ рд╕рдХреНрд╖рдо рд╣реИ рдФрд░ VSCode рдореЗрдВ рдирд╣реАрдВ рд╣реИред)
рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдпрд╣ рдЙрдкрдпреЛрдЧ рдорд╛рдирдХ рдФрд░ рдЕрддреНрдпрдВрдд рд╕рд╛рдорд╛рдиреНрдп рдФрд░ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ, рдФрд░ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЗрд╕ рдирд┐рдпрдо рдХреЛ рд╡рд┐рдлрд▓ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдЯреНрд░рд┐рдЧрд░ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред
рд╢реЙрд░реНрдЯ-рд╕рд░реНрдХрд┐рдЯрд┐рдВрдЧ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП &&
рдФрд░ ||
IMHO RHS рдХреА рдЬрд╛рдБрдЪ рдирд╣реАрдВ рдХреА рдЬрд╛рдиреА рдЪрд╛рд╣рд┐рдПред рдпрд╣ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╡реНрдпрд╡рд╣рд╛рд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП (рдпрд╛ рдХрдо рд╕реЗ рдХрдо allow-any-rhs
рдЬреИрд╕рд╛ рдХреЛрдИ рд╡рд┐рдХрд▓реНрдк рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП)ред рд╡рд░реНрддрдорд╛рди рдореЗрдВ, рдореИрдВ strict-boolean-expressions
рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛, рдХреНрдпреЛрдВрдХрд┐ рд╣рдорд╛рд░реЗ рдХреЛрдб-рдмреЗрд╕ рдореЗрдВ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╢реЙрд░реНрдЯ-рд╕рд░реНрдХрд┐рдЯрд┐рдВрдЧ рд╣реИред
рдПрд▓рдПрдЪрдПрд╕ рдХреА рдЬрд╛рдВрдЪ рдЖрдИрдПрдордПрдЪрдУ рдХреА рддрд░рд╣ рд╣реА рд░рд╣рдиреА рдЪрд╛рд╣рд┐рдП, рдХреНрдпреЛрдВрдХрд┐ рдПрд▓рдПрдЪрдПрд╕ рдХреЗ рд░реВрдк рдореЗрдВ string
рдпрд╛ number
рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЦрддрд░рдирд╛рдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдпрд╣ рдЙрджрд╛рд╣рд░рдг рджреЗрдЦреЗрдВ:
function foo(x: string | number | null) {
return x || defaultValue;
}
рдпрд╣ рдЦрддрд░рдирд╛рдХ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдХрдИ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдпрд╣ рд╕рдордЭрдиреЗ рдореЗрдВ рдЕрд╕рдлрд▓ рд╣реЛрдВрдЧреЗ рдХрд┐ рди рдХреЗрд╡рд▓ null
рдмрд▓реНрдХрд┐ 0
рдФрд░ ""
рдХрд╛рд░рдг defaultValue
рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рдПрдЧрд╛ред
рдореБрдЭреЗ рдЕрдкрдиреЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рдкреНрд░рдореБрдЦ рдмрдЧ рд╕реЗ рдирд┐рдкрдЯрдирд╛ рдкрдбрд╝рд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдЗрд╕ рдмрд╛рдд рдкрд░ рдзреНрдпрд╛рди рджреЗрдиреЗ рдореЗрдВ рд╡рд┐рдлрд▓ рд░рд╣реЗ рд╣реИрдВ рдХрд┐ ""
рдФрд░ 0
рднреА рдЭреВрдареЗ рд╣реИрдВред рдЗрд╕ рддрд░рд╣ рдХреЗ рдХреЛрдб рдХреЛ рд░реЛрдХрдирд╛, strict-boolean-expressions
рд▓рд┐рдП рдореЗрд░рд╛ рдкреНрд░рд╛рдердорд┐рдХ рдЙрдкрдпреЛрдЧ-рдорд╛рдорд▓рд╛ рд╣реИред
https://github.com/palantir/tslint/pull/4159 рдореЗрдВ рдлрд┐рдХреНрд╕реНрдб рдмрд╕ рдПрдХ рд╕рд╣рдпреЛрдЧреА рд╕реЗ рд╕рдореАрдХреНрд╖рд╛ рдХреА рдЬрд░реВрд░рдд рд╣реИред
рдУрд╣, рдмрд╕ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ рдХрд┐ рдореЗрд░рд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдЦрд░рд╛рдм рдерд╛:
const x = possiblyUndefined || 5;
рдпрд╣ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдХреНрдпреЛрдВрдХрд┐ possiblyUndefined
0
рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдПрдХ рддрд░реНрдХ рддреНрд░реБрдЯрд┐ рд╣реЛ рд╕рдХрддреА рд╣реИред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ @dobesv рдХрд╛ PR рдпрд╣рд╛рдВ рдХрд╛рдо рдХрд░реЗрдЧрд╛ред
рд╕рд░рдгреА рдХреЗ рд▓рд┐рдП рд╢рд╛рдорд┐рд▓ рд╣реИ рдПрдХ ES7 рд╕реБрд╡рд┐рдзрд╛ рд╣реИред
ES7 рдпрд╛ ESNEXT рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдЕрдкрдирд╛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ
рд╕рд╛рджрд░,
@rimiti рд╣рд╛рдп, рдореИрдВ рдпрд╣ рдирд╣реАрдВ рд╕рдордЭ рд╕рдХрддрд╛ рдХрд┐ рдЖрдк рдХрд┐рд╕ рдмрд╛рдд рдХрд╛ рдЬрд┐рдХреНрд░ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдХреНрдпрд╛ рдЖрдк рд╡рд╛рдХрдИ рдЙрд╕ рдЯрд┐рдкреНрдкрдгреА рдХреЛ рд╕рд╣реА рдзрд╛рдЧреЗ рдореЗрдВ рдкреЛрд╕реНрдЯ рдХрд░ рдЪреБрдХреЗ рд╣реИрдВ?
@dobesv рдУрд╣, рдЖрдкрдХреЛ рдЦреЗрдж рд╣реИ;)
#4159 рджреНрд╡рд╛рд░рд╛ рддрдп рдХрд┐рдпрд╛ рдЧрдпрд╛, рдЕрдЧрд▓реА рд░рд┐рд▓реАрдЬрд╝ рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реЛрдЧрд╛
рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА
рдореЗрд░реА рд░рд╛рдп рдореЗрдВ,
strict-boolean-expressions
рдХреЛ рдХреЗрд╡рд▓&&
рдФрд░||
рдХреЗ рдмрд╛рдПрдВ рдСрдкрд░реЗрдВрдб рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдПред рд╡реЗ рдСрдкрд░реЗрдЯрд░ рд╣реИрдВ (рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ) рдЯрд░реНрдирд░реА рдХреЗ рд▓рд┐рдП рдЪреАрдиреА:a && b
рдмрд░рд╛рдмрд░ рд╣реИa ? b : a
, рдФрд░a || b
рдмрд░рд╛рдмрд░ рд╣реИa ? a : b
ред рдЬрдм рдЖрдк рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЙрди рд╢рдмреНрджреЛрдВ рдореЗрдВ рд╕реЛрдЪрддреЗ рд╣реИрдВ, рддреЛ рдЖрд░рдПрдЪрдПрд╕ рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░рдирд╛ рдмрд╣реБрдд рдорд╛рдпрдиреЗ рд░рдЦрддрд╛ рд╣реИ, рдФрд░ рдпрд╣ рд╢реЙрд░реНрдЯ-рд╕рд░реНрдХрд┐рдЯрд┐рдВрдЧ рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдЯрд░реНрдирд░реА рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗ рдЕрдиреБрд░реВрдк рд▓рд╛рдПрдЧрд╛редрдлрд┐рд░ , рдЕрдЧрд░ рдкреВрд░реА рдЪреАрдЬ рдЕрдЧрд░/рдХреЗ рд▓рд┐рдП/рд╕рдордп рдХреЗ рдЕрдВрджрд░ рд╣реИ, рддреЛ
strict-boolean-conditions
рдЪрд▓рди рдореЗрдВ рдЖ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рд╕рдордЧреНрд░ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреА рдЬрд╛рдВрдЪ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕рдореЗрдВ рд╕рднреА рдЙрдкрдпреЛрдЧреА рдорд╛рдорд▓реЗ рд╢рд╛рдорд┐рд▓ рд╣реЛрдВрдЧреЗ, рдФрд░ рдореИрдВ рдЗрд╕ рдирд┐рдпрдо рдХреЛ рдлрд┐рд░ рд╕реЗ рдЪрд╛рд▓реВ рдХрд░ рдкрд╛рдКрдВрдЧрд╛редрдЬрд┐рд╕ рдХреЛрдб рдиреЗ рдЗрд╕реЗ рдореЗрд░реЗ рд▓рд┐рдП рдПрдХ рд╕рдорд╕реНрдпрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдХрд┐рдпрд╛ рдерд╛ рд╡рд╣ рдпрд╣ рджрд╕реНрддрд╛рд╡реЗрдЬ рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдкреИрдЯрд░реНрди рдерд╛ :
@ajafff рдЙрдирдХрд╛ рдХреЛрдб рдореЗрд░реЗ рд▓рд┐рдП рд▓рд┐рдВрдЯрд░ рдкрд╛рд╕ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ рд╕рднреА рдирд┐рдпрдо рдХреЗ рд╡рд┐рдХрд▓реНрдк рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рдХрд╛рд░рдг, рдирд┐рд░рдВрддрд░ RHS рдХреЗ рдХрд╛рд░рдг:
рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХрд╛ рдЗрд░рд╛рджрд╛ рдПрд▓рдПрдЪрдПрд╕ рдкрд░ рдПрдХ рд╕рд╢рд░реНрдд рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрд░рдПрдЪрдПрд╕ рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░рдиреЗ рдХрд╛ рдореЗрд░рд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рднреА рдЙрд╕рдХреА рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдХрд░реЗрдЧрд╛ред