次のようなコードを見つけました:
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 は関数の呼び出しによって保護されているブロック内で型を に絞り込みます。コンパイラは、 が保護されているブロック内にあると認識します(保護されているブロック内でのみ)。boolean
isString()
true
string
foo
string
{
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 を使用する利点です。