ダウンキャスト
抽象度の高い型から低い型へのキャスト
安全性はプログラマに委ねられる
例
code:ts
type Animal = Cat | Dog;
type Cat = 'cat';
type Dog = 'dog';
const a: Animal = 'cat';
const b = a as Cat; // downcasting
const c = a as Dog; // downcasting
Animal型のaを、CatとDogにdowncasしている
コンパイラに「俺が正しいから信じてくれ」と言っている感じ
bの方は、正しい使い方ができており、より厳密にできていると捉えられる
問題なのはcの方で、これは明らかに間違っているが特にerrorにはならない
ここが危険
例
code:ts
// T <: S
type S = { x: string };
type T = { x: string; y: number };
const a: S = { x: 'a' };
const b = a as T;
const c = b.y // 型はnumber。実際の値はundefined
bはfieldをxしかもって無いはずなのに、b.yにアクセスできてしまう
ダウンキャストが失敗した時の対応の例
例外の送出
ダウンキャスト演算子を型の動的なテストの一種で置き換える
意味がわからんmrsekut.icon
参考
型検査時は検査を保留するが、代わりに実行時に実際の型と検査をする、と書いている
MLか何か特定の言語の話?