Description
Suggestion
π Search Terms
is:issue is:open control flow analysis destructure
β Viability Checklist
My suggestion meets these guidelines:
- This wouldn't be a breaking change in existing TypeScript/JavaScript code
- This wouldn't change the runtime behavior of existing JavaScript code
- This could be implemented without emitting different JS based on the types of the expressions
- This isn't a runtime feature (e.g. library functionality, non-ECMAScript syntax with JavaScript output, new syntax sugar for JS, etc.)
- This feature would agree with the rest of TypeScript's Design Goals.
β Suggestion
TypeScript 4.4 has a feature called Control Flow Analysis of Aliased Conditions and Discriminants, which essentially allows a variable to carry type information about another variable.
I believe something similar could happen when destructuring discriminated unions.
Object destructuring is a very common pattern in JavaScript, but we need to avoid it often in TypeScript because it loses type information:
declare var it: Iterator<number>;
const { value, done } = it.next();
if (!done) {
value; // we know it's a number, but it's any
}
has to be artificially transformed to satisfy the typechecker:
const result = it.next();
if (!result.done) {
result.value; // is narrowed to a number
}
With TypeScript 4.4, it looks like we're very close to having this feature:
const result = it.next();
const { value, done } = result;
if (!done) {
result.value; // `done` tracks result's type
value; // but not value's
}
π Motivating Example
These patterns emerge naturally in JavaScript and currently have to be transformed to fit TypeScript's ability to infer types.
The IteratorResult example above.
Another example is with action to state reducers:
type Action =
| { type: 'A', payload: number }
| { type: 'B': payload: string };
function reducer(state: Whatever, { type, payload }: Action) {
switch (type) {
case 'A':
payload.toFixed();
break;
case 'B':
payload.toUpperCase();
break;
}
}
π» Use Cases
I think the examples above already cover this.