The way I look at Typescript vs. Javascript is that with Typescript, it's like having always having a pair programming buddy (the compiler) who never makes mistakes.
The way I look at Typescript vs. Javascript is that with Typescript, it's like having always having a pair programming buddy (the compiler) who never makes mistakes.
When I was using typescript this still came up if you missed an array bounds check, you'd end up with an unexpected undefined. Pretty annoying and tough to debug.
Has this changed (I can't see how it could have, but... maybe?)
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 excludedThis says "either an array of Foo or an array of undefined", right? Not "either an array of Foo or just undefined"?
Foo[] | undefined[] means either 1) an array of Foo, or 2) an array of undefined.
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.
var foos: Foo[] = [new Foo()];
foos[1].bar();
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.
ReactDOM.render(
<Start />,
document.getElementById("content")
);
Will error because getElementById can return null. And it's 100% valid and imo 100% worth checking for - but I can't say I've ever heard of anyone doing it before Typescript suggested it.This pattern really isn't hard and if it saves you from one "undefined is undefined" then it was worth it.
const item = document.getElementById("content");
if (item == null) {
console.log("Render container missing");https://github.com/technion/awesome-sec-audit/blob/master/as...
If you insert the element directly in line 25 you'll get:
error TS2345: Argument of type 'HTMLElement | null' is not assignable to parameter of type 'Element'.