-
Notifications
You must be signed in to change notification settings - Fork 13k
Open
Labels
Needs ProposalThis issue needs a plan that clarifies the finer details of how it could be implemented.This issue needs a plan that clarifies the finer details of how it could be implemented.SuggestionAn idea for TypeScriptAn idea for TypeScript

Description
Suggestion
Ability to discriminate between union members when not all union members are known.
Use Cases
- redux actions: See Allow switch type guards #2214 (comment)
- This would enable us to discriminate on Node kinds without converting Node to a huge union (which slows down compilation too much). (Also, Node is effectively open-ended because we add new kinds fairly often.)
Examples
interface Shape {
unique kind: string;
}
interface Square extends Shape {
kind: "square";
size: number;
}
interface Circle extends Shape {
kind: "circle";
radius: number;
}
// other shapes may exist
function area(s: Shape) {
switch (s.kind) {
case "square":
return s.size * s.size;
case "circle":
return Math.PI * s.radius ** 2;
default:
return 0; // Or hand off to some other function that handles other Shape kinds
}
}
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. new expression-level syntax)
Workarounds
Cast the general type to a union of known type.
function area(sIn: Shape) {
const s = sIn as Square | Circle;
...
cpplearner, lindboe, kgtkr, Ulrikop, lucaspiller and 5 more
Metadata
Metadata
Assignees
Labels
Needs ProposalThis issue needs a plan that clarifies the finer details of how it could be implemented.This issue needs a plan that clarifies the finer details of how it could be implemented.SuggestionAn idea for TypeScriptAn idea for TypeScript