Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why is `booleanValue` different from `booleanValue === true`?

Tags:

typescript

Adding === true to the expression in the code below breaks TypeScript's type inference. I know that pretty much all style guides recommend not adding === true, but I would like to know why the two expressions are different.

Can anybody explain this?

function someFunction(element: HTMLElement | null) {
  const isAllowed = element !== null;

  if (isAllowed) {
    // Here, the TypeScript compiler is able to infer that element isn't null...
    thisFunctionRequiresAnElement(element);
  }

  if (isAllowed === true) {
    // ... but here, it cannot. Why?
    thisFunctionRequiresAnElement(element);
  }
}

function thisFunctionRequiresAnElement(element: HTMLElement) {
  console.log(element);
}

Link to TypeScript Playground with the code snippet above.

like image 670
Jan Aagaard Avatar asked Nov 29 '25 17:11

Jan Aagaard


1 Answers

This is a TS 4.4 "feature".

The isAllowed variable acts like a predicate. This means isAllowed holds the information that element is not null.

By adding a === true this removes the predicate. You're in fact creating a new boolean from a boolean expression.

I don't know if we can consider this a bug or a feature.

Playground with TS < 4.4 with both conditions with errors


Edit:

The comment by Anders Hejlsberg (TS creator) nails it :

Narrowing through indirect references occurs only when the conditional expression or discriminant property access is declared in a const variable declaration with no type annotation, and the reference being narrowed is a const variable, a readonly property, or a parameter for which there are no assignments in the function body.

like image 142
Matthieu Riegler Avatar answered Dec 01 '25 09:12

Matthieu Riegler



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!