2016-10-17 4 views
8

が、私はこのようになりますいくつかのコードに出くわした:私は、ドキュメントやGoogleのいずれかにisを検索することができハチいない`is`キーワードはtypescriptで何をしますか?

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

、それはかなり一般的な単語だと基本的にすべてのページに表示されます。

キーワードは、そのコンテキストで何をしていますか?

答えて

5
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”); 

isString()が呼び出された後に、この関数は真を返す場合は、上記のフォーマット(だけでなく戻り型のブールを使用する)で「テストは、文字列です」 、TypeScriptは、関数の呼び出しによって保護されるブロック内の型をstringに絞り込みます。 コンパイラは、TYPE述部がちょうどコンパイル時に使用されている

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

fooが(とONLY以下の保護されたブロックで)以下の保護されたブロック内の文字列だと思います。結果の.jsファイル(ランタイム)は、TYPEを考慮しないため、違いはありません。

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

例: 上記のコード例では、コンパイルエラーとランタイムエラーは発生しません。

例2: TypeScriptが型を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はその型をブロック内の文字列に限定しますが、foo.toExponentialはコンパイルエラーを生成しません(TypeScriptでは文字列型)。ただし、実行時に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)); 
} 
} 

結論は、(タイプ述語)「テストが文字列である」コードが実行時エラーを持ってする機会を持つことになり、開発者に伝えるために、コンパイル時に使用されていることです。 javascriptの場合、開発者はコンパイル時にエラーを知らないでしょう。これはTypeScriptを使用する利点です。

1

私が知っている唯一の使用はあなたの例の一つである:タイプガード

を参照してくださいここでは、このreference

でタイプガードをユーザ定義が別で定義されたユーザには「タイプ述語」(arg is MyType)を指定型述語を使用reference

+1

私もこれをドキュメントで見ましたが、どのような奇妙なデザインの決定で、このケースは完全に型の 'ブール型'を返すことによって処理できますか? – benjaminz

+0

@benjaminzこれはSOのそれ自身の質問であることを保証するかもしれませんが、私はあなたに彼らがどのように異なっているかの簡単な例を示すことができます。 'is'キーワードは実際に型をキャストしており、コードの後ろに型エラーをキャッチすることができます。詳細については、[この例](https://goo.by/WAlvg)を参照してください。 – styfle

+0

@benjaminzどのようにブール値で処理できるかわかりません。 Typescriptは、オブジェクトを渡す関数が型ガードのように機能していることを知る必要があります。型がtrueまたはfalseを返すだけであれば、オブジェクトが真実であればtrueを返す任意の関数だけでなく、実際に型ガードであることをTypescriptがどのように知ることができますか?どのようにオブジェクトのタイプを絞り込むことがわかりますか?第2に、オブジェクトの型をどの型に絞り込むかをどのように知ることができますか?パラメータが3つのタイプのいずれかである場合はどうなりますか? 「真」は特定のタイプに対応することを知る必要があります。 – pushkin

関連する問題