JavaScriptに静的型を追加することのポイントは、型の安全性をいくらか保証することです。私は、配列の索引付けが、as any
やnot nullアサーション演算子のような汚いトリックを使わずに型の安全性を破るように思っていました。配列内のインデックスは、TypeScriptの型安全性を破るのはなぜですか?
let a: Array<number> = [1,2,3,4];
let b: number = a[4]; //undefined
このコードでは、型の安全性に違反することがわかっていても、TypeScriptエラーは発生しません。タイプT
たかのようにタイプT | undefined
あるべきインデックス演算子[]
によって作用Array<T>
のタイプは、しかし、活字体のコンパイラはそれを扱うように私には思えます。さらなる調査の際
、私は、この動作は、同様のオブジェクトのインデックス演算子の使用に適用されることを発見しました。どのような場合でも、インデックス演算子は型の安全ではないようです。
class Example {
property: string;
}
let c: Example = { property: "example string" }
let d: string = c["Not a property name"]; //undefined
型エラーを起こすことなく、任意のタイプに割り当てることができ、任意のキー戻りany
のタイプのオブジェクトのインデックスオペレータの使用。ただし、これは、--noImplicitAny
コンパイラオプションを使用して解決できます。
私の質問は、アレイブレイクセーフのインデックス作成のような基本的なことは何故ですか?これは、デザイン制約、見落とし、またはTypeScriptの意図的な部分ですか?
。 [githubに関するディスカッション](https://github.com/Microsoft/TypeScript/issues/13778)に従ってください。さらに詳しいことがあれば教えてください。 – dotcs
Javascriptオブジェクトは、Typescriptがそれらを扱うのが好きな方法で実際に型付きクラスではないので、意図的に回避しています。私は、別の機能によって追加された追加のプロパティを持つ可能性のあるオブジェクトを受け取ったときに、このメソッドを何回か使用しなければなりませんでした。 –