给定一个打字稿数组,我希望它将我的选项限制为只用整数索引添加值类型的元素。但事实并非如此,我找不到合理的理由。
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;
有谁知道为什么会这样?
答案 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
它是动态正确的,但是静态地......是或否?
所以,我对你的问题没有答案,但我认为这对编译器来说只是一个困难的情况,它只是通过这里。