You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
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
constfoo: {a?: string}={a: 'bar'};constkey='a'asconst;if(key!infoo){// non-null operator stripped and key exists in objconsole.log(foo[key]);}if(foo!instanceofObject){// non-null operator stripped and obj is Objectconsole.log(typeoffoo);}
🙁 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.
The text was updated successfully, but these errors were encountered:
🔎 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
andinstanceof
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 likeif key not in obj
. To them this might be if the tsc treatedkey !== 'a'
askey == 'a'
🕗 Version & Regression Information
⏯ Playground Link
https://www.typescriptlang.org/play/?ts=5.8.0-dev.20241116#code/MYewdgzgLgBAZiEAuGBvAhgfhdATgSzAHMBfGAXjXRQHIAjdXGkgbgChRJYBrAUwE8KMGuhox0EGJ2js2+ODAAUfQQEJC8RAEo0bGFPAQQAG14A6YyCKKEIANoqAulvYk2chTcQx1XdGGBeEAUAeToAK15gKB1UPQNIE3NLayh+AAcghVsXNhIgA
💻 Code
🙁 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.The text was updated successfully, but these errors were encountered: