You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Search Terms:
user-defined type guard, condition, inference, narrow, control-flow
Code
typeA={type: 'A',aProp: 42}typeB={type: 'B',bProp: 42}typeAorB=A|BfunctionisAorB(obj: unknown): obj is AorB{returntrue}// Does not work if narrowed with if/elseletx: anyif(isAorB(x)){if(x.type==='A'){x.aProp// ERROR (x still AorB)}else{x.bProp// ERROR (x still AorB)}}// Curriously works with switch/caseif(isAorB(x)){switch(x.type){case'A':
x.aProp// WORKS (x is A)break;default:
x.bProp// WORKS (x is B)}}
Expected behavior:
After passing User-Defined Type Guard, it should be possible to narrow this type using classical control flow.
Actual behavior:
After passing a User-Defined Type Guard, it's not possible to narrow using if/else control flow.
TypeScript Version: 3.4.3
Search Terms:
user-defined type guard, condition, inference, narrow, control-flow
Code
Expected behavior:
After passing User-Defined Type Guard, it should be possible to narrow this type using classical control flow.
Actual behavior:
After passing a User-Defined Type Guard, it's not possible to narrow using if/else control flow.
It works with switch/case though.
Playground Link:
https://www.typescriptlang.org/play/#src=type%20A%20%3D%20%7B%0A%20%20%20%20type%3A%20'A'%2C%0A%20%20%20%20aProp%3A%2042%0A%7D%0A%0Atype%20B%20%3D%20%7B%0A%20%20%20%20type%3A%20'B'%2C%0A%20%20%20%20bProp%3A%2042%0A%7D%0A%0Atype%20AorB%20%3D%20A%20%7C%20B%0A%0Afunction%20isAorB(obj%3A%20unknown)%3A%20obj%20is%20AorB%20%7B%20%0A%20%20%20%20return%20true%0A%7D%0A%0A%0A%2F%2F%20Does%20not%20work%20if%20narrowed%20with%20if%2Felse%0A%0Alet%20x%3A%20any%0A%0Aif%20(isAorB(x))%20%7B%0A%20%20%20%20if%20(x.type%20%3D%3D%3D%20'A')%20%7B%0A%20%20%20%20%20%20%20%20x.aProp%20%2F%2F%20ERROR%20(x%20still%20AorB)%0A%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20x.bProp%20%2F%2F%20ERROR%20(x%20still%20AorB)%0A%20%20%20%20%7D%0A%7D%0A%0A%2F%2F%20Curriously%20works%20with%20switch%2Fcase%0A%0Aif%20(isAorB(x))%20%7B%0A%20%20%20%20switch%20(x.type)%20%7B%0A%20%20%20%20%20%20%20%20case%20'A'%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20x.aProp%20%2F%2F%20WORKS%20(x%20is%20A)%0A%20%20%20%20%20%20%20%20%20%20%20%20break%3B%0A%0A%20%20%20%20%20%20%20%20default%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20x.bProp%20%2F%2F%20WORKS%20(x%20is%20B)%0A%20%20%20%20%7D%0A%7D%0A
Related Issues:
The text was updated successfully, but these errors were encountered: