Typescript で `is` キーワードは何をしますか? 質問する

Typescript で `is` キーワードは何をしますか? 質問する

次のようなコードを見つけました:

export function foo(arg: string): arg is MyType {
    return ...
}

isドキュメントでも Google でも検索できませんでしたが、これはかなり一般的な単語であり、基本的にすべてのページに表示されます。

そのコンテキストでキーワードは何をするのでしょうか?

ベストアンサー1

参照先ユーザー定義の型ガード関数詳細については。

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使用するのではなく)、が呼び出された後、関数が を返す場合、 TypeScript は関数の呼び出しによって保護されているブロック内で型を に絞り込みます。コンパイラは、 が保護されているブロック内にあると認識します(保護されているブロック内でのみ)。booleanisString()truestringfoostring

{
    console.log("it is a string" + foo);
    console.log(foo.length); // string function
}

型述語はコンパイル時にのみ使用されます。結果の.jsファイル (実行時) は TYPE を考慮しないため、違いはありません。

以下の 4 つの例で違いを説明します。

例 1: 上記のサンプルコードにはコンパイル エラーも実行時エラーもありません。

string例 2: 以下のサンプル コードでは、TypeScript が型を絞り込み、それがメソッド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: (type predicate) を使用しない場合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(type predicate) はコンパイル時に使用され、コードに実行時エラーが発生する可能性があることを開発者に伝えます。JavaScript の場合、開発者はコンパイル時にエラーが発生するかどうかはわかりません。これが TypeScript を使用する利点です。

おすすめ記事