1. ホーム
  2. typescript

[解決済み】typescriptで`is`キーワードは何をするのですか?

2022-04-14 05:18:03

質問

次のようなコードに出会いました。

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 を、関数の呼び出しでガードされたブロックの中に入れてください。 コンパイラは foostring を、下のブロックの中で(そして下のブロックの中だけで)表示します。

{
    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 型)。しかし、ランタイムでは stringtoExponential メソッドを使用するため、ランタイムエラーが発生します。

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を使う利点です。