TypeScript Version: 3.0.0-dev.20180705
Search Terms: false/true loosened/expanded/loses specificity into boolean
Code
typeFoo=FooBase|FooArray;typeFooBase=string|false;typeFooArray=FooBase[];declareletfoo1: Foo;declareletfoo2: Foo;foo1=[...Array.isArray(foo2) ? foo2 : [foo2]];
Expected behavior:
No error.. In the else clause, [foo2], it retains string | false so Array<string | false>. Logically since everything is taking place in the typings layer, foo2 should still be strongly bounded to false and will never be true.
Actual behavior:
Errors. In the else clause, [foo2], it expanded/loosened to string | boolean so Array<string | boolean>.
tmp.ts:7:1 - error TS2322: Type '(string | boolean)[]' is not assignable to type 'Foo'.
Type '(string | boolean)[]' is not assignable to type 'FooBase[]'.
Type 'string | boolean' is not assignable to type 'FooBase'.
Type 'true' is not assignable to type 'FooBase'.
7 foo1 = [...Array.isArray(foo2) ? foo2 : [foo2]];
~~~~
Playground Link:Link
Related Issues:
TypeScript Version: 3.0.0-dev.20180705
Search Terms: false/true loosened/expanded/loses specificity into boolean
Code
Expected behavior:
No error.. In the else clause,
[foo2], it retainsstring | falsesoArray<string | false>. Logically since everything is taking place in the typings layer,foo2should still be strongly bounded tofalseand will never betrue.Actual behavior:
Errors. In the else clause,
[foo2], it expanded/loosened tostring | booleansoArray<string | boolean>.Playground Link:Link
Related Issues: