-
Notifications
You must be signed in to change notification settings - Fork 30.4k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
The removal of TypeScript types may result in broken JavaScript code #56597
Comments
This is due to ASI issues around function mkId() {
return (
(x )=>x);
}
function mkId() {
return (
(x )=>x);
} |
Yes, introducing parenthesis around the generic closure would do the trick. |
We see how swc transpiles: const { stripTypeScriptTypes } = require('node:module');
const code = stripTypeScriptTypes(`function mkId() {
return <T>
(x: T) => x;
}
const id = mkId();
console.log(id(5));`);
console.log(code); Output: function mkId() {
return
(x ) => x;
}
const id = mkId();
console.log(id(5)); I'm only afraid how we can fix this without changing locations cc @kdy1 |
@marco-ippolito it can be fixed by using parens - basically it'd only change one location, where it adds the paren before the semicolon - otherwise it'd just be adding a paren instead of a blank space. |
If we change even 1 location it would introduce edge cases.
|
More naturally (and works even if the second line isn't indented): return 0,
(x ) => x; |
I suppose the semicolon could be replaced with the paren. but yeah, |
I went ahead and opened an issue on SWC. |
Thanks for the report @BlueNebulaDev Ashley and I made some bold claims about prizes for anyone who could break this. If you are ever in London and wish to collect, please let me know 😉 |
Ohh, that sounds intriguing and fun! |
PR-URL: #56785 Fixes: #56597 Reviewed-By: Rafael Gonzaga <[email protected]> Reviewed-By: Marco Ippolito <[email protected]> Reviewed-By: James M Snell <[email protected]>
Version
v23.2.0
Platform
Subsystem
No response
What steps will reproduce the bug?
Run the following TypeScript script with nodejs (with the
--experimental-strip-types
option, if necessary):How often does it reproduce? Is there a required condition?
It always happen deterministically.
What is the expected behavior? Why is that the expected behavior?
The script should print
5
.What do you see instead?
The script errors with:
Additional information
I believe that Node strips TS types in such a way that the script I showed gets turned into the following JS code:
And unfortunately Node interprets a
return
followed by a new line as areturn;
.The same behavior happens with different (but similar code), for instance:
It is somewhat common to break templates on a new line, when the generic types are complex (for instance if they have long
extend
clauses) and this issue is particularly annoying because the IDE (which understands TS) doesn't flag it as an error.The text was updated successfully, but these errors were encountered: