TypeScript数组的意外行为

时间:2015-05-28 07:59:01

标签: typescript

给定一个打字稿数组,我希望它将我的选项限制为只用整数索引添加值类型的元素。但事实并非如此,我找不到合理的理由。

var test: string[] = [];
// OK as expected
test[1] = "42";

// Error as expected
test[1] = 42;

// Error as expected
test.test = 42;

// Unexpected OK, why? 
test['1'] = 42;

http://www.typescriptlang.org/Playground#src=var%20test%3A%20string%5B%5D%20%3D%20%5B%5D%3B%0A%2F%2F%20OK%20as%20expected%0Atest%5B1%5D%20%3D%20%2242%22%3B%0A%0A%2F%2F%20Error%20as%20expected%0Atest%5B1%5D%20%3D%2042%3B%0A%0A%2F%2F%20Error%20as%20expected%0Atest.test%20%3D%2042%3B%0A%0A%2F%2F%20Unexpected%20OK%2C%20why%3F%20%0Atest%5B '1' %5D%20%3D%2042%3B%0A 0A%

有谁知道为什么会这样?

2 个答案:

答案 0 :(得分:2)

这是因为TypeScript的设计方式。您可以通过字符串索引器访问任何对象,默认情况下它采用类型any。这是为了方便移植现有代码。

对于定义的内容,字符串索引会导致有效的类型检查,请考虑:

var test: string[] = []; 

// Ok 
test['push']('123');
// Error
test['push'](123);

答案 1 :(得分:-1)

因为在JavaScript:

var a = [];
a[1] = 123;
a['1'] = 456;
alert(a[1]); // 456

更新1。

可能TypeScript编译器无法跟踪方括号中没有整数(因为只有编译时检查而没有运行时开销)?

例如,如何在编译时检查情况?

var idx = getSomething();
var arr: string[] = [];
arr[idx] = 'Abcdef';

更新2。

首先,方括号不仅用于访问数组项,因此可以使用具有此名称的属性。

其次,有可能难以追查。

实施例

var idx = {}
idx.toString = (): number => { return 2; };

var arr:number[] = [10, 11, 12, 13];
alert(arr[idx]); // 12

它是动态正确的,但是静态地......是或否?

所以,我对你的问题没有答案,但我认为这对编译器来说只是一个困难的情况,它只是通过这里。