(no title)
curveship | 9 years ago
var foos1 = [] as Foo[],
foos2 = [] as (Foo | undefined)[];
// ... later
var foo1 = foos1[i],
foo2 = foos2[i];
foo1.bar(); // types fine, TS assumes non-undefined
foo2.bar(); // TS type error, as you haven't checked undef
if (foo2) foo2.bar(); // types fine, undef excluded
yoklov|9 years ago
E.g. if I missed a bounds check, and access past the end of a `Foo[]`, it would be typed as `Foo` (and not `Foo | undefined`), but really be `undefined.
Consider this code.
foos[1] will be undefined (since it's past the end of the array) but will typecheck as a Foo.Obviously it's bad if I forget a bounds check, but it's similarly bad if I forgot a null check.
Of course, I understand why this issue exists, but it is an issue.
vosper|9 years ago
This says "either an array of Foo or an array of undefined", right? Not "either an array of Foo or just undefined"?
jiaweihli|9 years ago
Foo[] | undefined[] means either 1) an array of Foo, or 2) an array of undefined.
josteink|9 years ago