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
{{ message }}
Repository navigation
Refactoring to convert && chain to optional chain expression #35018
Reacted by Matija Grcic, Jiri Spac, Steven, Nico Jansen, Alex Quintero, Ismail Ghallou , Bruno Antunes, ExE Boss, Luciano Lima, Abhishek Datta and 6 more
Reacted by Bruno Antunes, Michael Loughry, Mohit Mayank, Luciano Lima, Abhishek Datta, Roger Padilla, Ali Taheri Moghaddar and AwesomeObserver
Uri Goldshtein (@Urigo) That could be done too, but I think having this granularity is good because it's not strictly the same semantics. ?. always returns undefined, && keeps the original nullish value.
Also keep in mind that optional chaining returns true on 0 and '' (empty string), normally falsy values in javascript. So running this as a code mod would almost certainly cause unintended bugs.
Reacted by Nico Jansen, Kristiqn Tachev, Johan Faerch, Justin Grant, Max Schmitt, Carlos Abbate, Ian Copp, Josef and Ali Taheri Moghaddar
Also keep in mind that optional chaining returns true on 0 and '' (empty string), normally falsy values in javascript. So running this as a code mod would almost certainly cause unintended bugs.
I'm not sure I really follow. Such code would be rather questionable in the first place, no? If you have an && chain that could be converted to an optional chain, and it returns '' or false as a short-circuit, then the same code would be throwing a TypeError if the value is a non-empty string or true.
I could certainly envision a scenario where code was written that depends on short-circuiting on falsy values. We're eternally stuck with typeof null === 'object' for backward compatibility reasons, after all.
Also there's no TypeError because boolean and string are object-coercible. The subsequent property access would just return undefined and short-circuit.
Jinesh Shah (@jineshshah36)[|code|] is the syntax used typescript four-slash tests to mark a selection. Some diagnostic suggestions are not exposed unless they can be applied to the selected code.
All too eager to start using the ?. syntax I managed to play a trick on myself by converting if (foo && foo.bar && foo.bar.indexOf(someValue) !== -1)
to if (foo?.bar?.indexOf(someValue) !== -1)
which had quite the opposite behaviour of what was intended heh.
Just one of the (probably more obvious in hindsight) things a script would have to keep in mind :)
changed the title [-]Convert && chain to optional chain expression[/-][+]Refactoring to convert && chain to optional chain expression[/+]on Apr 22, 2020
I’m not sure of the viability of going after library refactorings (as opposed to just JS -> TS), but I think one huge win would be if TS could automatically refactor lodash/get usages and/or ramda/pathOr usages.
Activity
DanielRosenwasser commentedon Nov 9, 2019
You know, mostly like this
Urigo commentedon Nov 9, 2019
maybe a code-mode or babel transform that runs throughout a codebase?
DanielRosenwasser commentedon Nov 9, 2019
Uri Goldshtein (@Urigo) That could be done too, but I think having this granularity is good because it's not strictly the same semantics.
?.always returnsundefined,&&keeps the original nullish value.switz commentedon Nov 10, 2019
Also keep in mind that optional chaining returns
trueon0and''(empty string), normally falsy values in javascript. So running this as a code mod would almost certainly cause unintended bugs.MLoughry commentedon Nov 11, 2019
I'm not sure I really follow. Such code would be rather questionable in the first place, no? If you have an
&&chain that could be converted to an optional chain, and it returns''orfalseas a short-circuit, then the same code would be throwing a TypeError if the value is a non-empty string ortrue.fatcerberus commentedon Nov 12, 2019
I could certainly envision a scenario where code was written that depends on short-circuiting on falsy values. We're eternally stuck with
typeof null === 'object'for backward compatibility reasons, after all.Also there's no TypeError because boolean and string are object-coercible. The subsequent property access would just return
undefinedand short-circuit.jineshshah36 commentedon Nov 17, 2019
[|foo && foo.bar && foo.bar.baz|]
What do the “|” mean?
dragomirtitian commentedon Nov 18, 2019
Jinesh Shah (@jineshshah36)
[|code|]is the syntax used typescript four-slash tests to mark a selection. Some diagnostic suggestions are not exposed unless they can be applied to the selected code.MrAndersen1 commentedon Dec 9, 2019
All too eager to start using the ?. syntax I managed to play a trick on myself by converting
if (foo && foo.bar && foo.bar.indexOf(someValue) !== -1)to
if (foo?.bar?.indexOf(someValue) !== -1)which had quite the opposite behaviour of what was intended heh.
Just one of the (probably more obvious in hindsight) things a script would have to keep in mind :)
[-]Convert && chain to optional chain expression[/-][+]Refactoring to convert && chain to optional chain expression[/+]DanielRosenwasser commentedon May 5, 2020
There's a question of whether or not nullish coalescing (
??) should be supported here as part of the code action.DanielRosenwasser commentedon May 5, 2020
Also, what the supported patterns are:
&&property chains:a && a.b.c && a.b.c.da?.b.c?.da.b ? a.b.c : "hello"a.b?.c ?? "hello"cisstring | null?&&property/call chains:a && a.b.c && a.b.c()a?.b.c?.()Kingwl commentedon May 13, 2020
Ahhhh, i have some existed work about this. And I'm happy to port here
kylemh commentedon May 13, 2020
I’m not sure of the viability of going after library refactorings (as opposed to just JS -> TS), but I think one huge win would be if TS could automatically refactor lodash/get usages and/or ramda/pathOr usages.
Kingwl commentedon May 13, 2020
Good idea. IMO TypeScript cannot provide that but there's outside tools.
eg: https://github.com/HearTao/ts-upgrade
Kingwl commentedon May 20, 2020
Are there any existed tools or algorithms to compare expression and judge they are equality?
I have some ugly work about it but they cannot work well.