Type inference - code after early return from an 'if' should infer the same type as the 'else' block would #8886
Closed
Description
opened on May 30, 2016
Version 1.8
First of all I'm sorry if I get the jargon wrong, I'm new to typescript (I tried to search for this issue and failed, I may have used the wrong search terms).
When using type guards, code in an else
block uses the condition in the if
to infer the type of the variable. However if the if
contains an early return
the rest of the function should be treated as the else
of the if
from we we returned.
Code
// A self-contained demonstration of the problem follows...
type Foo = { a: string };
function isFoo(x): x is Foo {
return x && typeof(x.a) === 'string';
}
type Bar = { b: string };
function buz1(arg: Foo|Bar) : string {
if (isFoo(arg))
return arg.a; // OK arg inferred to be Foo
else
return arg.b; // OK arg inferred to be Bar
}
function buz2(arg: Foo|Bar) : string {
if (isFoo(arg))
return arg.a; // OK arg inferred to be Foo
return arg.b; // ** Error b isn't a member of Foo|Bar **
}
Expected behavior:
function buz2
should compile with no error.
Actual behavior:
Error when accessing member b
of arg
even though arg
can be inferred to be of type Bar
(as it is in buz1.else
).
Activity