Tslint: рдЧреИрд░-рдмреВрд▓рд┐рдпрди рд╕рдВрджрд░реНрдн рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рддрд╛рд░реНрдХрд┐рдХ рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдЦреНрдд-рдмреВрд▓рд┐рдпрди-рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпрд╛рдБ рд╕рдХреНрд░рд┐рдп рдирд╣реАрдВ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП

рдХреЛ рдирд┐рд░реНрдорд┐рдд 4 рдЕрдХреНрддреВре░ 2017  ┬╖  18рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: palantir/tslint

рдмрдЧ рд░рд┐рдкреЛрд░реНрдЯ

  • __TSLint рд╕рдВрд╕реНрдХрд░рдг__: 5.7
  • __рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕рдВрд╕реНрдХрд░рдг__: 2.5.3
  • __TSLint рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЪрд▓ рд░рд╣рд╛ рд╣реИ__: CLI

рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛрдб рдкрдВрдХреНрддрд┐рдмрджреНрдз рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ

// 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 рдирд╣реАрдВ рд╣реИ: рди рддреЛ рдЗрдирдкреБрдЯ рдФрд░ рди рд╣реА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХрд╛ рдЖрдЙрдЯрдкреБрдЯред

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, 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.

рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХрд╛ рдЗрд░рд╛рджрд╛ рдПрд▓рдПрдЪрдПрд╕ рдкрд░ рдПрдХ рд╕рд╢рд░реНрдд рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрд░рдПрдЪрдПрд╕ рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░рдиреЗ рдХрд╛ рдореЗрд░рд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рднреА рдЙрд╕рдХреА рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдХрд░реЗрдЧрд╛ред

рд╕рднреА 18 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рд╡рд┐рдЪрд╛рд░? рдкреНрд░рд╛рд░реНрдердирд╛? рдХрд╣рд╛рдВ/рдХреИрд╕реЗ рд╢реБрд░реВ рдХрд░реЗрдВ, рдЗрд╕ рдкрд░ рд╕реБрдЭрд╛рд╡?

@marcind рдХреНрдпрд╛ рдЖрдк рдЙрджрд╛рд╣рд░рдг рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдирд┐рдпрдо рдХреЛ рдмрджрд▓рдиреЗ рд╕реЗ рдЗрд╕реЗ рдЕрд▓рдЧ рддрд░реАрдХреЗ рд╕реЗ рдХреИрд╕реЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП?

рдХреНрд╖рдорд╛ рдХрд░реЗрдВ, рдореЗрд░рд╛ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╕рдмрдорд┐рд╢рди рдХреМрди рд╕рд╛ рднрд╛рдЧ рдЕрд╕реНрдкрд╖реНрдЯ рд╣реИ?

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореЗрд░рд╛ рдореБрджреНрджрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдирд┐рдпрдо рдХреЗрд╡рд▓ "рдмреВрд▓рд┐рдпрди рд╕рдВрджрд░реНрдн" рдореЗрдВ рдЪрд▓рдирд╛ рдЪрд╛рд╣рд┐рдП, рдореИрдВ рджреЛ рдорд╛рдорд▓реЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪ рд╕рдХрддрд╛ рд╣реВрдВ:

  1. if , while , рдпрд╛ for рдореЗрдВ рдкреНрд░рдпреБрдХреНрдд
  2. boolean рд░реВрдк рдореЗрдВ рдЯрд╛рдЗрдк рдХрд┐рдП рдЧрдП рд╡реЗрд░рд┐рдПрдмрд▓ рдХреЛ рдЕрд╕рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ред

рдЬрдм рдореИрдВ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рди рдпрд╛ рд╢реЙрд░реНрдЯ-рд╕рд░реНрдХрд┐рдЯ рдореВрд▓реНрдпрд╛рдВрдХрди рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рддреЛ рдирд┐рдпрдо рдирд╣реАрдВ рдЪрд▓рдирд╛ рдЪрд╛рд╣рд┐рдП

  1. const a: string = potentiallyUndefinedString || "the default";
  2. 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 рджреНрд╡рд╛рд░рд╛ рддрдп рдХрд┐рдпрд╛ рдЧрдпрд╛, рдЕрдЧрд▓реА рд░рд┐рд▓реАрдЬрд╝ рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реЛрдЧрд╛

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

mateiacd picture mateiacd  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

mrand01 picture mrand01  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

dashmug picture dashmug  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

jacob-robertson picture jacob-robertson  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

allbto picture allbto  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ