microsoft / microsoft/TypeScript

Non-null assertion operator whitespace allowances can create confusing conditional statements

Offen
#60,518 2 Kommentare 2 Reaktionen 0 zugewiesene Personen Auf GitHub ansehen

Dieses Issue hat noch niemand übernommen.

Experience Enhancement Help Wanted Suggestion
Vorherrschende Sprache
Go
Sterne
111k
Forks
14.4k
Ø Merge
1 T. 19 Std.
Gemergte PRs (30 T.)
117

Beschreibung

🔎 Search Terms

You can write a non-null assertion operator with whitespace after a variable name and no white space before certain keywords such as in and instanceof and the type checker doesn't fail but instead strips the operator creating the opposite condition as it appears.

To a someone not familiar with TypeScript/JavaScript key !in obj reads like if key not in obj . To them this might be if the tsc treated key !== 'a' as key == 'a'

🕗 Version & Regression Information
  • This changed between versions N/A and N/A
  • This changed in commit or PR N/A
  • This is the behavior in every version I tried, and I reviewed the FAQ for entries about Common "Bugs" That Aren't Bugs
  • I was unable to test this on prior versions because N/A
⏯ Playground Link

https://www.typescriptlang.org/play/?ts=5.8.0-dev.20241116#code/MYewdgzgLgBAZiEAuGBvAhgfhdATgSzAHMBfGAXjXRQHIAjdXGkgbgChRJYBrAUwE8KMGuhox0EGJ2js2+ODAAUfQQEJC8RAEo0bGFPAQQAG14A6YyCKKEIANoqAulvYk2chTcQx1XdGGBeEAUAeToAK15gKB1UPQNIE3NLayh+AAcghVsXNhIgA

💻 Code
const foo: {a?: string} = {a: 'bar'};
const key = 'a' as const;

if (key !in foo) {
  // non-null operator stripped and key exists in obj
  console.log(foo[key]);
}

if (foo !instanceof Object) {
  // non-null operator stripped and obj is Object
  console.log(typeof foo);
}
🙁 Actual behavior

The TSC stripped the non-null assertion, the operator should not be considered a non-null operator at all in this situation.

🙂 Expected behavior

I would expect a syntax error in this situation.

Additional information about the issue

This is a real problem not just hypothetical, I noticed a discussion started by a person learning typescript complaining about how their code was evaluating true regardless of the "negation operator" being used before the in keyword.

Image

Beitragsleitfaden

Beitragsleitfaden öffnen

Erste Schritte

  1. Lies das ganze Issue und danach den Beitragsleitfaden des Projekts.
  2. Schreib ins Issue, dass du es übernimmst — das erspart doppelte Arbeit.
  3. Forke das Repository und arbeite in einem Branch.
  4. Öffne einen Pull Request, der die Issue-Nummer nennt.

Rechercherichtung

Reproduziere die Beispiele aus dem Playground-Link mit tsc und konzentriere dich auf den Whitespace vor in und instanceof. Verfolge, wie diese Ausdrücke geparst und validiert werden, und füge Regressionstests hinzu, die zeigen, dass die Formen einen Syntaxfehler erzeugen, anstatt die Non-Null-Assertion zu entfernen.

Vom Indexierungsmodell aus dem Issue-Text verfasst.

Bewertung

Tech-Stack
javascript, typescript
Bereich
compilers
Issue-Typ
Bug
Schwierigkeit
4/5
Geschätzter Aufwand
3-5 Tage
Aktivitätsstatus
Veraltet
Klarheit
Größtenteils klar
Anfängerfreundlichkeit
35/100

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.