実装X
するものはすべて に変換できる必要がありますX
が、必ずしも に変換できるとは限りませんX1
。
ここに詳細があります。以下のコードは、簡単な例を示しています。基本的に、タイプ (インターフェース) がある場合、それは(クラス) または(クラス) のX
いずれかによって実装できます。X1
X2
型を (実装からインターフェースに) ダウングレードすることはできますが、型を (インターフェースから特定の実装に) アップグレードすることはできません。
別の見方をすれば、実際よりも具体的でないものを作成することはできますが、実際よりも具体的なものを作成することはできません。
interface X {
type : string;
val : number;
}
class X1 implements X {
type : string;
val : number;
}
class X2 implements X {
type: string;
val: number;
myMethod() {
}
}
var x1 = new X1();
var x2 = new X2();
var exampleA: X = x1; // happy
var exampleB: X = x2; // happy
var exampleC: X1 = exampleA; // Not happy...
このすべての結果は、キャストする必要があるということです:
var exampleC: X1 = <X1>exampleA; // happy...
ただし、実際には機能しない可能性があるため、注意してください。
var exampleC: X2 = <X2>exampleA; // seems happy...
exampleC.myMethod(); // oh dear!
アップデート
このコードに関しては...
for (var n in p1) {
var p2 : X1 = p1[n];
}
foreach
JavaScript では、これはループと同等ではありません。これが通常使用されるのは、オブジェクト内のプロパティを反復することであり、配列で使用すると、明示的に設定されたインデックスのみが表示されます (すべてのアイテムではありません)。配列を反復処理するには、次を使用する必要があります。
for (var i = 0; i < p1.length; i++) {
var p2 : X1 = p1[i]; // same warning as before
}
では、なぜTypeScript は変数p1[n]
への割り当てを許可するのでしょうか? X1
興味深い質問と答えはここにあります...
にカーソルを合わせるとp1[n]
、 のタイプが表示されます。X[]
これは のタイプでありp1
、 のタイプではありませんp1[n]
。この例を確認すると、次p1[n]
のタイプであることがわかりany
ます。
var example = p1['test']; // I used 'test' because n is a string.
それは型であるためany
、コンパイラはそれをX1
. つまり、あなたが思っているように、からからではなくに変換しany
ています。X1
X
X1