We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
TypeScript Version: 3.4.0-dev.201xxxxx
Search Terms: union, index type
Code
class Test<Props extends Object> { constructor(public o: Props) {} get<K extends keyof Props>(k: K) : Props[K] { return this.o[k]; } } interface A {t: "A";}; interface B {t: "B";}; type u = Test<A> | Test<B>; const tmp = new Test<B>({t: 'B'}) as u; switch(tmp.get('t')) { case 'A': break; case 'B': break; }
Expected behavior:
Code compiles with tmp.get('t') having type "A" | "B".
tmp.get('t')
"A" | "B"
This works for:
Actual behavior:
Compilation fails with error:
Type '"B"' is not comparable to type '"A"'.
Type of tmp.get('t') is only "A".
"A"
Problem is not contained to string literals, but also other types. Enountered this bug using immutable-js Record.get().
Playground Link: | Test; const tmp = new Test({t: 'B'}) as u; switch(tmp.get('t')) { case 'A': break; case 'B': break; } " rel="nofollow">playground
Related Issues: None found
TypeScript Version: 3.4.0-dev.201xxxxx
Search Terms: union, index type
Code
Expected behavior:
Code compiles with
tmp.get('t')having type"A" | "B".This works for:
Actual behavior:
Compilation fails with error:
Type of
tmp.get('t')is only"A".Problem is not contained to string literals, but also other types. Enountered this bug using immutable-js Record.get().
Playground Link: | Test; const tmp = new Test({t: 'B'}) as u; switch(tmp.get('t')) { case 'A': break; case 'B': break; } " rel="nofollow">playground
Related Issues: None found