🦄

たまに見る「as」ってなんですの?

2022/10/19に公開約2,500字

Q.たまに見る「as」ってなんですの?
A.型アサーションです。

型アサーション

https://typescriptbook.jp/reference/values-types-variables/type-assertion-as
これは、型推論を上書きする機能です。

型アサーションの定義方法は、as 型です。

たとえば以下のコードは型推論に頼るとコンパイルエラーになってしまいます。

type Person {
  age: number;
  name: string;
}

let teru = {}; // {}型に型推論される

teru.age = 23; // Property 'fuga' does not exist on type '{}'
teru.name = '佐藤'; // Property 'piyo' does not exist on type '{}'

上記のコードに対して型アサーションを使い、コンパイルエラーをなくしたものが以下になります。

type Person {
  age: number;
  name: string;
}

let teru = {} as Person; // Person型に型アサーションする

teru.age = 23;
teru.name = '佐藤';

型アサーションのおかげで変数teruPerson型として扱えるようになったため、コンパイルエラーが解消されました。

明らかに正しくない型へは型アサーションを利用しても変更できません。

let umeAge: number = '隆太郎' as number; // Conversion of type 'string' to type 'number' may be a mistake

型アサーションの注意点

型アサーションは一見便利に思うかもですが注意が必要です。
それは、型アサーションは任意の型に上書きができるため、型の安全性が保証されなくなります。
つまり、構文の間違いに気付きにくくなり、実行時に初めて気が付くことになるという事です。

下記の場合、オブジェクトの中に必要なプロパティを記載する必要がありますが、プロパティが足りなくてもコンパイルが通ってしまいます。

interface Person {
  age: number;
  name: string;
};

let chika = {} as Person; //必要なプロパティを記載しなくても、TypeScriptの型チェックが入らずにエラーが出ない。 

型を初期化したい場合、極力型アサーションを使用するのではなく、下記コードのように、変数に型を明記していく方法が良いかと思います。

interface Person {
  age: number;
  name: string;
}

const chika: Person = {
  age: 27;
}
//Property 'name' is missing in type '{ age: number; }' but required in type 'foo'

こうすることで、コンパイルエラーが動くようになりますね。

型アサーションの使い所

型アサーションはひとまずコンパイルエラーをなんとか解決したいという場合に利用します。
前単元で述べたとおり、型の安全性が保証されないので、むやみに使うのではなく、極力コンパイルエラーを解消するための応急処置的な位置付けで捉えてもらえたら良いかと思います。(最終手段的なw)

型アサーションとキャスト

型アサーションは他の言語でいうキャストに良く似ています。

一方、型アサーションは値の型変換はしません。コンパイル時にコンパイラに型を伝えるだけです。

型アサーションと型アノテーション

型アサーションと似たような名前で型アノテーションがあります。ですが、これらは全くもって別のものになります。

一方、型アサーションはコンパイラに型推論の不正確さを伝えるものです。

まとめ

  • as = 型アサーションのこと。
  • 型アサーションは値の型変換はしない。

参考文献

Discussion

ログインするとコメントできます