2017-08-08 4 views
4

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の意図的な部分ですか?

+1

。 [githubに関するディスカッション](https://github.com/Microsoft/TypeScript/issues/13778)に従ってください。さらに詳しいことがあれば教えてください。 – dotcs

+0

Javascriptオブジェクトは、Typescriptがそれらを扱うのが好きな方法で実際に型付きクラスではないので、意図的に回避しています。私は、別の機能によって追加された追加のプロパティを持つ可能性のあるオブジェクトを受け取ったときに、このメソッドを何回か使用しなければなりませんでした。 –

答えて

1

任意のキーを持つオブジェクトに対してインデックス演算子を使用すると、任意の型が返されます。これは型エラーを発生させることなく任意の型に割り当てることができます。ただし、これは--noImplicitAnyコンパイラオプションを使用することで解決できます。

はい。厳重な安全を心がける場合は、noImplicitAnyを使用してください。またstrict:truestrictNullChecksおよび他のもの)。

私の質問は、配列のインデックス型としての安全性を損なうのはなぜですか?これは、デザイン制約、見落とし、またはTypeScriptの意図的な部分ですか?

安全性のレベルがあります。 strictが最も強力です。あなたはあなたのコードをどの程度厳格にしたいかを選択します。言っ

https://basarat.gitbooks.io/typescript/content/docs/options/intro.htmlから

より、伝統的なプログラミング言語であり、型システムによって許可されていないものをとのハードの境界を持っています。 TypeScriptは、スライダーを置く場所を制御できる点で異なります。未解決の問題だ

+0

お返事ありがとうございます。私の質問は、タイプTを返すタイプ配列でのインデックス作成に関するものでした。 – rstif350

関連する問題