为什么TypeScript允许在没有警告的情况下将字符串转换为数

时间:2012-10-18 18:00:39

标签: typescript

编写此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())
}

1 个答案:

答案 0 :(得分:18)

简短回答:a[i]的类型为any,而不是string

答案很长:a的类型为string[]。在TypeScript中,由T[]索引的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...
}

如果你真的确信没有人会破坏你的对象,或者你从一组已知安全的字符串值中获取索引,你可以写一个索引类型。在您按字符串索引的情况下,您可能最好使用对象而不是数组:

var a: {[s: string]: string; } = {};
a['hello'] = 'world';
var i:string;
for (i in a) {
    var c : number = a[i]; // Issues an error
}