概要: このチュートリアルでは、値に新しい型を割り当てることができるTypeScriptの型アサーションについて学びます。
型アサーションは、TypeScriptコンパイラに値を指定された型として扱うように指示します。TypeScriptでは、型アサーションにas
キーワードまたは<>
演算子を使用できます。
asキーワードを使用した型アサーション
以下は、querySelector()
メソッドを使用して、HTMLドキュメントの最初のinput要素を選択します。
let el = document.querySelector('input["type="text"]');
Code language: TypeScript (typescript)
document.querySelector()
メソッドの戻り値の型はElement
型であるため、次のコードはコンパイル時エラーを引き起こします。
console.log(el.value);
Code language: TypeScript (typescript)
エラー
Property 'value' does not exist on type 'Element'.
Code language: JavaScript (javascript)
その理由は、value
プロパティがElement
型に存在しないためです。HTMLInputElement
型にのみ存在します。
これを解決するには、as
キーワードを使用して、el
要素の型をHTMLInputElement
として扱うようにTypeScriptコンパイラに指示できます。
const el = document.querySelector('input[type="text"]');
const input = el as HTMLInputElement;
Code language: TypeScript (typescript)
これで、input
変数はHTMLInputElement
型になります。そのため、そのvalue
プロパティにアクセスしてもエラーは発生しません。次のコードは機能します。
console.log(input.value);
Code language: TypeScript (typescript)
Element
オブジェクトにHTMLInputElement
型を割り当てる別の方法は、プロパティに次のようにアクセスする場合です。
let enteredText = (el as HTMLInputElement).value;
Code language: TypeScript (typescript)
HTMLInputElement
型は、Element
型に拡張するHTMLElement
型を継承していることに注意してください。
typeA
からtypeB
への変数の型アサーションの構文は次のとおりです。
let a: typeA;
let b = a as typeB;
Code language: TypeScript (typescript)
<>演算子を使用した型アサーション
as
キーワードに加えて、型アサーションを実行するために<>
演算子を使用できます。たとえば、
let input = <HTMLInputElement>document.querySelector('input[type="text"]');
console.log(input.value);
Code language: TypeScript (typescript)
<>
演算子を使用した型アサーションの構文は次のとおりです。
let a: typeA;
let b = <typeB>a
Code language: TypeScript (typescript)
型アサーションの結果
型アサーションが失敗すると、型アサーションの使用方法と実際実行時の型に応じて、異なる種類のエラーが発生します。
1) コンパイル時エラー
互換性のない型間で型アサーションを実行しようとすると、TypeScriptコンパイラがエラーまたは警告を出す場合があります。たとえば、
let price = '9.99';
let netPrice = price as number; // error
Code language: JavaScript (javascript)
この例では、数値型を文字列に代入しようとすると、TypeScriptコンパイラは次のコンパイル時エラーを発行します。
Conversion of type 'string' to type 'number' may be a mistake because neither type sufficiently overlaps with the other. If this was intentional, convert the expression to 'unknown' first.
Code language: JavaScript (javascript)
2) 実行時エラー
オブジェクトの型アサーションを、その構造と一致しない型に対して実行し、存在しないプロパティにアクセスしようとすると、実行時エラーが発生します。たとえば、
let el = document.querySelector('#name');
let input = el as HTMLInputElement;
console.log(input.value.length);
Code language: JavaScript (javascript)
この例では、IDが#name
の要素がinput要素でない場合、input.value
は実行時にundefined
になります。したがって、値のlength
プロパティにアクセスすると、実行時エラーが発生します。
TypeError: Cannot read properties of undefined (reading 'length')
Code language: JavaScript (javascript)
3) 予期しない動作
型アサーションが正しくない場合、コンパイル時または実行時エラーは発生しないかもしれませんが、後でコードで予期しない動作が発生する可能性があります。エラーが型アサーションのポイントで発生しない可能性があるため、デバッグが困難になる可能性があります。
概要
- 型アサーションを使用すると、値に新しい型を割り当てることができます。
- 型アサーションを実行するには、
as
キーワードまたは<>
演算子を使用します。