TL;DR
TypeScriptのキャストはas T
の記法と<T>
の記法の2つがある。
アップキャスト
extends元の基底クラスの型にキャストすることをアップキャストと呼ぶ。
class A {
a = 1;
}
class A2 extends A {
a2 = 2;
}
var a2 = new A2;
function testA(a: A) {
console.log(a.a); // 1を出力
}
testA(a2); // A2からAにアップキャスト
TypeScriptのアップキャストは明示しないでできる。
ダウンキャストは明示する必要がある。明示しないとエラーになる。
ダウンキャスト
extends先の派生クラスの型にキャストすることをダウンキャストと呼ぶ。
class A {
a = 1;
}
class A2 extends A {
a2 = 2;
}
var a = new A;
console.log((a as A2).a2); // as A2でダウンキャストを明示
undefinedを出力。
ダウンキャストのもう1つの方法
class A {
a = 1;
}
class A2 extends A {
a2 = 2;
}
var a = new A;
console.log((<A2>a).a2); // <A2>でダウンキャストを明示
undefinedを出力。
TypeScript 1.6以降、<>が曖昧なため .tsx ファイル(JSXのTypeScriptバージョン)で利用できなくなった。
ダウンキャストには as を利用することが望ましい。
おわりに
2つの記法を見かけるので、両方とも覚えておこう。
実はTypeScriptはキャストのことを**Type Assertion(型アサーション)**と呼ぶ。
それが「型キャスト」と呼ばれない理由は、キャストは一般的に何らかのランタイムサポートを意味するからです。しかし、型アサーションは純粋にコンパイル時の構造体であり、コードをどのように解析するかについてのヒントをコンパイラに提供する方法です。
> var a = 0;
> console.assert(a > 0, "positive number");
Assertion failed: positive number
アサーションの意味が違うので、JavaScriptから来た人は型アサーションがわからない。
参考
Typescript: cast an object to other type. How? And instanceof or typeof? - acdcjunior’s
Basic Types · TypeScript
Type Assertion(型アサーション) - TypeScript Deep Dive 日本語版