TypeScript Version: 4.1.2, 4.2.0-dev.20201205
Search Terms: type inference switch statement
Code
enum TYPES {
ONE = 'one',
TWO = 'two'
}
interface IOne {
a: string,
type: TYPES.ONE
meta: {
type: TYPES.ONE
}
}
interface ITwo {
b: string,
type: TYPES.TWO
meta : {
type: TYPES.TWO
}
}
[].map((block:IOne | ITwo) => {
// This works.
switch (block.type) {
case TYPES.ONE:
block.a
break;
case TYPES.TWO:
block.b
break;
}
// This does NOT work.
switch (block.meta.type) {
case TYPES.ONE:
block.a
break;
case TYPES.TWO:
block.b
break;
}
});
Expected behavior:
The switch over block.meta.type should infer the same types as the switch over block.type.
Actual behavior:
The swich over block.meta.type errors the following and does not infer type correctly. The switch over block.type DOES infer type correctly.
Property 'a' does not exist on type 'IOne | ITwo'. Property 'a' does not exist on type 'ITwo'.
Property 'b' does not exist on type 'IOne | ITwo'. Property 'b' does not exist on type 'IOne'.
Playground Link:
https://www.typescriptlang.org/play?ts=4.1.2#code/KYOwrgtgBAKgmgBQKIGUoG8BQUdQPIBySUAvFAOQD2Iw5ANNrjAOp6kUAuA7peZgL6ZMASxAdgAJwBmAQwDGwKAEk8NDIxwyAXFADOHCaIDmDXDg4BPAA7Ad8ZCgB0hJBpwRgHberO-LNu0RUZyI3KEFBETFJWQVlGB4fXAAjHX1DEBM3f1tYIKcWPDcPLygdLF9cHMCHR0K3CKEAbQBdRwgZKwAKLuSAG0o5AGstFTUAH3ieAEpSAD4knAB6JdgAC2FdKB4JId1HN10uYQ45NahegeHHHNmKyqg5GV1Fe2CXLTCH-sGhxxkoF9KskJMAZEMANxAx7PV75OqsT4PXw-a7JQHIswgsGQhpCMwrdabKAAE0owC2BDwMG2lF2BzMRxOZwuqL+JRkN2swDu0KeLzytQ+0KxVz+AJFKVB4KhyP5cNqhSRmJwbMc6MlquluLMEWmEKAA
Related Issues:
#30763
#30557
#30593
Note:
I'm sorry if this is obvious or at least an obvious duplicate. I've searched, I've asked on Gitter and Stack Overflow. I'm fairly new to Typescript and this is my first bug repport. I did my best.
TypeScript Version: 4.1.2, 4.2.0-dev.20201205
Search Terms: type inference switch statement
Code
Expected behavior:
The switch over
block.meta.typeshould infer the same types as the switch overblock.type.Actual behavior:
The swich over
block.meta.typeerrors the following and does not infer type correctly. The switch overblock.typeDOES infer type correctly.Playground Link:
https://www.typescriptlang.org/play?ts=4.1.2#code/KYOwrgtgBAKgmgBQKIGUoG8BQUdQPIBySUAvFAOQD2Iw5ANNrjAOp6kUAuA7peZgL6ZMASxAdgAJwBmAQwDGwKAEk8NDIxwyAXFADOHCaIDmDXDg4BPAA7Ad8ZCgB0hJBpwRgHberO-LNu0RUZyI3KEFBETFJWQVlGB4fXAAjHX1DEBM3f1tYIKcWPDcPLygdLF9cHMCHR0K3CKEAbQBdRwgZKwAKLuSAG0o5AGstFTUAH3ieAEpSAD4knAB6JdgAC2FdKB4JId1HN10uYQ45NahegeHHHNmKyqg5GV1Fe2CXLTCH-sGhxxkoF9KskJMAZEMANxAx7PV75OqsT4PXw-a7JQHIswgsGQhpCMwrdabKAAE0owC2BDwMG2lF2BzMRxOZwuqL+JRkN2swDu0KeLzytQ+0KxVz+AJFKVB4KhyP5cNqhSRmJwbMc6MlquluLMEWmEKAA
Related Issues:
#30763
#30557
#30593
Note:
I'm sorry if this is obvious or at least an obvious duplicate. I've searched, I've asked on Gitter and Stack Overflow. I'm fairly new to Typescript and this is my first bug repport. I did my best.