Typescriptが提供する型保証の程度を理解しようとしています。私はエラーが予想されるシナリオを見つけましたが、Typescriptは不平を言っていません。Typescript関数が無効な引数をエラーなしで受け入れる
特定のインターフェイスに一致するパラメータを持つ関数を定義しました。次に、一致しない引数を使って関数を呼び出します。ここでは、コードは(or in playground)です:私の引数の変数が明示的に互換性のないインターフェースを宣言した場合、予想通り
interface ArgumentInterface {
[key: number]: string
}
interface InvalidArgumentInterface {
[key: string]: number
}
interface InvalidArgumentInterface2 {
foo: number
}
function myFunction(arg: ArgumentInterface) {
// function body
}
let validArgument: ArgumentInterface = {};
validArgument[5] = 'I am a string';
let invalidArgument: InvalidArgumentInterface = {
foo: 42
};
let invalidArgument2: {foo: number} = {
foo: 42
};
let invalidArgument3: InvalidArgumentInterface2 = {
foo: 42
};
let invalidArgument4 = {
foo: 42
};
myFunction(validArgument); // no typescript error, as expected
myFunction(invalidArgument); // typescript error, as expected
myFunction(invalidArgument2); // no typescript error!
myFunction(invalidArgument3); // typescript error, as expected
myFunction(invalidArgument4); // no typescript error!
、私は活字体エラーを取得します。しかし、私の引数変数が(インターフェイスなしで)型リテラルを宣言するか、まったく型を宣言しない場合、Typescriptはエラーを予期しますが、まったく文句を言うことはありません。
"noImplicitAny"フラグをtrueに設定しました。
誰でもこの現象を説明できますか?
私が誤解したことを発見したと思います。[key:number]のインデックスシグネチャを定義しても文字列キーの追加が妨げられることはありません。あれは正しいですか? – Brian
はい、そうです。しかし、それは別の方法では動作しません。また、jsオブジェクトのキーは**常に**文字列であることに注意してください。数字を渡すと文字列に変換されます。あなたが本当に数字と文字列の間にマップを望むなら、 'Map' –