在编写这个TypeScript代码时,我惊讶地发现当我从字符串转换为数字时,TypeScript编译器不会发出警告.
var a = new string[];
a.push('a')
a.push('b')
a.push('c')
var i:string;
for (i in a) {
var c : number = a[i]; <---- Here a is string[] but I assign it to c which is number
alert(c.toString())
}
Run Code Online (Sandbox Code Playgroud)
Rya*_*ugh 18
简短的回答:a[i]
是类型any
,而不是string
.
答案a
很长:属于类型string[]
.在TypeScript中,由类型值的结果T[]
索引的类型的对象,但通过a索引它们会导致.类型的值可以自由转换为任何其他类型.number
T
string
any
any
为什么?
当您通过字符串索引数组时,编译器根本无法预测将要发生的事情,并且您仍然坚持使用any
.考虑:
// Elsewhere...
Array.prototype.danger = 35;
// Meanwhile, back at the ranch:
var a = [ 'z' ];
var i: string;
for (i in a) {
var x = a[i]; // i = 'danger', a[i] = 35...
}
Run Code Online (Sandbox Code Playgroud)
如果你真的确信没有人会破坏你的对象,或者你从一组已知安全的字符串值中获取索引,你可以编写一个索引类型.在您按字符串索引的情况下,您最好使用对象而不是数组:
var a: {[s: string]: string; } = {};
a['hello'] = 'world';
var i:string;
for (i in a) {
var c : number = a[i]; // Issues an error
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
4251 次 |
最近记录: |