[解決済み】typescriptで`is`キーワードは何をするのですか?
質問
次のようなコードに出会いました。
export function foo(arg: string): arg is MyType {
return ...
}
を検索できていないんです。
is
ドキュメントでもgoogleでも、かなり一般的な単語で、基本的にすべてのページで表示されます。
その中で、このキーワードはどのような役割を担っているのでしょうか。
どのように解決するのか?
のリファレンスを参照してください。 ユーザー定義型ガード関数 を参照してください。
function isString(test: any): test is string{
return typeof test === "string";
}
function example(foo: any){
if(isString(foo)){
console.log("it is a string" + foo);
console.log(foo.length); // string function
}
}
example("hello world");
型述語を使用する
test is string
を使うのではなく)上記のフォーマットで
boolean
の後に、戻り値の型として
isString()
が呼び出された場合、その関数が
true
,
TypeScript は、その型を
string
を、関数の呼び出しでガードされたブロックの中に入れてください。
コンパイラは
foo
は
string
を、下のブロックの中で(そして下のブロックの中だけで)表示します。
{
console.log("it is a string" + foo);
console.log(foo.length); // string function
}
型述語はコンパイル時に使用されるだけです。その結果
.js
ファイル(実行時)は、TYPEを考慮しないので、何も変わりません。
以下の4つの例で、その違いを説明します。
例えば、1. 上記のサンプルコードでは、コンパイルエラーもランタイムエラーも発生しません。
例2.
の場合、コンパイルエラーになる(ランタイムエラーも)。
string
をチェックし
toExponential
に属さない。
string
メソッドを使用します。
function example(foo: any){
if(isString(foo)){
console.log("it is a string" + foo);
console.log(foo.length);
console.log(foo.toExponential(2));
}
}
例:3.
の場合、コンパイルエラーは発生しないが、実行時エラーが発生する。これは、TypeScriptが型を
string
はガードされたブロックの中にあり、ガードされたブロックの後にはない。
foo.toExponential
はコンパイルエラーにならない(TypeScriptはこれが
string
型)。しかし、ランタイムでは
string
は
toExponential
メソッドを使用するため、ランタイムエラーが発生します。
function example(foo: any){
if(isString(foo)){
console.log("it is a string" + foo);
console.log(foo.length);
}
console.log(foo.toExponential(2));
}
例)4.
を使用しない場合
test is string
(型述語)を使用すると、TypeScriptはガードされたブロック内の型を絞り込まないため、以下のサンプルコードはコンパイルエラーにはなりませんが、実行時エラーになります。
function isString(test: any): boolean{
return typeof test === "string";
}
function example(foo: any){
if(isString(foo)){
console.log("it is a string" + foo);
console.log(foo.length);
console.log(foo.toExponential(2));
}
}
という結論になります。
test is string
(型述語)は、コンパイル時に、コードが実行時エラーを起こす可能性があることを開発者に伝えるために使われます。javascriptの場合、開発者はコンパイル時にエラーを知ることはない。これがTypeScriptを使う利点です。
関連
-
[解決済み】Typescriptで、! (エクスクラメーションマーク/バン)演算子でメンバを再参照するのは?
-
[解決済み] TypeScriptで文字列を数値に変換する方法とは?
-
[解決済み] TypeScript で `window` に新しいプロパティを明示的に設定するにはどうすればよいですか?
-
[解決済み] TypeScriptでの取得と設定
-
[解決済み] TypeScriptでパラメータとして強く型付けされた関数は可能か?
-
[解決済み] TypeScriptでオブジェクトに動的にプロパティを割り当てるには?
-
[解決済み] Typescript は ?演算子をサポートしていますか?(そして、それは何と呼ばれているのでしょうか?)
-
[解決済み] TypeScriptのオブジェクトリテラルでの型定義
-
[解決済み] ジェネリックスを使用したTypescriptのarrow関数の構文はどのようになっていますか?
-
[解決済み】TypeScriptのインターフェースと型について
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Typescript: スプレッド型はオブジェクト型からしか作成できない
-
[解決済み] Typescript コンパイルエラー: error TS1109: 期待される式
-
[解決済み] eslintをtypescriptで使用する - モジュールへのパスを解決できない
-
[解決済み] TypeScript - Angular: 複数行の文字列
-
[解決済み] 'unknown' vs. 'any'
-
[解決済み] noImplicitAnyフラグを有効にしてtypescriptをコンパイルすると、"Index signature of object type implicitly has an 'any' type "というエラーが発生しますが、どうすれば防ぐことができますか?
-
[解決済み】ランタイムにオブジェクトのクラス名を取得する
-
[解決済み】tsconfig.jsonファイルを生成するにはどうしたらいいですか?
-
[解決済み】ブロックに`@ts-ignore`を使用するには?
-
[解決済み】Typescriptのパラメータ名のクエスチョンマークとは?