8

この 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())
}
4

1 に答える 1

18

短い答え:a[i]タイプは でありany、 ではありませんstring

長い答え:aタイプはstring[]です。TypeScript では、 a によってインデックス付けされた型のオブジェクトは typeT[]number値になりますが、 aTによってそれらをインデックス付けする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
}
于 2012-10-18T18:21:59.307 に答える