Because at JavaScript:
var a = [];
a[1] = 123;
a['1'] = 456;
alert(a[1]); // 456
Update 1.
Possibly TypeScript compiler could not trace that at square brackets there are not a integer (because of only compile-time checks and no runtime overhead)?
For example, how to check a situation at a compile time?
var idx = getSomething();
var arr: string[] = [];
arr[idx] = 'Abcdef';
Update 2.
First, square brackets is not only used for accessing array items, so it is possible to has a attribute with such name.
Second, there is possible a difficult situation to trace.
Example.
var idx = {}
idx.toString = (): number => { return 2; };
var arr:number[] = [10, 11, 12, 13];
alert(arr[idx]); // 12
It is dynamically correct, but statically... Yes or no?
So, i dont have an answer to your question, but i think that it is just a difficult situation for compiler and it just pass here.