microsoft / microsoft/TypeScript
Union with non-distinct discriminating property breaks inference somewhat (confusing error messages, invalid intellisense)
Open
Nobody has claimed this yet.
Domain: Error Messages
Experience Enhancement
- Dominant language
- Go
- Stars
- 111k
- Forks
- 14.3k
- Avg merge
- 2d 4h
- Merged PRs (30d)
- 132
Description
TypeScript Version: 4.0.2
Search Terms: discriminated union, error messages
Code
type Action = {
type: 'action1';
payload: {
property1: string;
};
} | {
type: 'action1';
payload: {
property2: number;
};
} | {
type: 'action2';
payload: {
property3: boolean;
};
}
const action: Action = { // Actual error is here
type: 'action1',
payload: {
property3: true // Expected error here
}
}
Expected behavior:
Expected error at action.payload.property3 declaration, perhaps something like:
Object literal may only specify known properties, and 'property3' does not exist in type '{ property1: string; } | { property2: number; }'.
Also, once the object has been refined by the type action1, intellisense should only provide property1 and property2 as a suggestion when declaring the payload.
Actual behavior:
An error message at the first line of the declaration:
Type '{ type: "action1"; payload: { property3: true; }; }' is not assignable to type 'Action'.
Type '{ type: "action1"; payload: { property3: true; }; }' is not assignable to type '{ type: "action2"; payload: { property3: boolean; }; }'.o
Type '"action1"' is not assignable to type '"action2"'.(2322)
Also, once the object has been refined by the type action1, intellisense still provides property3 as a suggestion when declaring the payload.
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Assessment
This issue has not been assessed yet.