TypeScript Version: 3.1.0-dev.20180829
Search Terms: generics expansion union equality typecheck
Code
type A = {type :"a"}
type B = {type :"b"}
type P<T extends A | B> = T["type"];
class C<T extends A | B> {
p: P<T> = 'x'; //error: Type '"x"' is not assignable to type '"a" | "b"'
// so when typechecking this assignment, it's known that
// P<T> actually is "a" | "b"
f(p: P<T>) {
if (p === 'x') { // why no error here
// when typechecking this equality check, P<T> is not expanded ?
}
}
// expected error, for illustration
f0(p: 'a' | 'b') {
if (p === 'x') { // error: This condition will always return 'false'
// since the types '"a" | "b"' and '"x"' have no overlap.
}
}
}
Expected behavior:
"This condition will always return 'false'" is reported when doing equality check between a variable declared with P<T> type and "x" literal
Actual behavior:
No error is reported for that particular equality check
Playground Link: link
Related Issues: did not find anything
TypeScript Version: 3.1.0-dev.20180829
Search Terms: generics expansion union equality typecheck
Code
Expected behavior:
"This condition will always return 'false'" is reported when doing equality check between a variable declared with
P<T>type and "x" literalActual behavior:
No error is reported for that particular equality check
Playground Link: link
Related Issues: did not find anything