as、any
TypeScriptが提供する型安全を否定する行為であり基本的に使ってはいけない。
anyやasを使って良いケース
TypeScriptのコンパイルが完璧ではなく使用を余儀なくされるケースがある。
?(Optional Chaining)
オブジェクト(配列も含む)の場合しか使用できない。
オブジェクトや配列ががnullやundefinedの場合にキーにアクセスしようとした際に、undefinedを返してくれます。
1 2 3 |
console.log(obj?.prop); // ドット表記法 console.log(obj?.['expr']); // ブラケット表記法 console.log(array?.[0]); // 配列のインデックスアクセス |
これを「Optional Chaining」と呼びます。
!
NULLじゃないと言い切る文法。NonNullAssertionOperatorというTypeScript2.0から登場した機能でどんな型にも使える。
1 2 |
const test = function(); // functionはstring | undefinedを返す関数。 test! |
変数の後につけると「string | undefined」とかの場合はstringとかにキャストしてくれる。
ただ、使用するとeslintで下記のエラーが出る。
1 |
warning Forbidden non-null assertion @typescript-eslint/no-non-null-assertion |
もし、!を使用する場合はeslintの解除を行う。
1 |
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion |
型の互換性
TypeScriptにおいてある型を他の型に代入する事が可能かどうかという概念のことです。例えば下記のようにany型にはstring型を代入する事が可能です。
1 2 3 |
let a: any = 'テスト'; let b: string = 'テスト2'; a = b; |
クラスの代入について
メンバーのデータ型に互換性があるかどうかをチェックしています。もし互換性がない場合はエラーになります。(なお、クラスに定義されているインターフェイス等は全く考慮はしません。あくまで代入される側と代入する側の内部で持っているメンバのデータ型のチェックになります。)
アサーション
型アサーション
例えば、下記のように記述した場合にbは数値が代入されていますが、普通にその後の文字列の代入も可能になってしまいます。
1 2 3 |
let a: any = 'テスト'; let b = a.length; b = 'あ'; |
下記のように「変数 as データ型」とする事で型変換して異なるデータ型代入時にエラーとする事が可能です。これを型アサーションと呼びます。
1 2 3 |
let a: any = 'テスト'; let b = (a as string).length; b = 'あ'; //エラーになる。 |
なお、下記のように記述することも可能ですが、これはReactの一部の文法と似ているため非推奨とされています。
1 2 3 |
let a: any = 'テスト'; let b = (<string>a).length; b = 'あ'; //エラーになる。 |
この記事へのコメントはありません。