`ReturnType`型ガードで戻り値の型を取得
TypeScriptにおけるtypeof
演算子と関数型からの戻り値の取得
typeof
演算子による関数オブジェクトの取得
function add(x: number, y: number): number {
return x + y;
}
const myAdd = add;
console.log(typeof add); // "function"
console.log(typeof myAdd); // "function"
上記コードでは、add
関数はnumber
型の引数2つを受け取り、number
型の戻り値を持つ関数として定義されています。myAdd
変数にはadd
関数オブジェクトが代入されます。
typeof add
とtypeof myAdd
を実行すると、どちらも"function"
という文字列が返されます。これは、typeof
演算子が関数の型情報ではなく、関数オブジェクトそのものを返していることを示しています。
ReturnType<T>
型ガードによる戻り値の取得
関数の戻り値の型情報を知りたい場合は、ReturnType<T>
型ガードを使用する必要があります。ReturnType<T>
は、ジェネリック型パラメータT
を持つ型ガードであり、T
が関数の型である場合、その関数の戻り値の型を返します。
function add(x: number, y: number): number {
return x + y;
}
const addResult: ReturnType<typeof add> = add(1, 2);
console.log(addResult); // 3
上記コードでは、addResult
変数にadd
関数の戻り値の型であるReturnType<typeof add>
型を代入しています。これは、addResult
変数にnumber
型の値しか代入できないことを意味します。
addResult
にadd(1, 2)
の結果を代入すると、3というnumber
型の値が格納されます。
- 関数の戻り値の型情報を知りたい場合は、
ReturnType<T>
型ガードを使用する必要があります。 typeof
演算子は、関数の型情報ではなく、関数オブジェクトそのものを返します。
// 関数定義
function add(x: number, y: number): number {
return x + y;
}
function subtract(x: number, y: number): number {
return x - y;
}
// 関数オブジェクトの取得
const addFunction = add;
const subtractFunction = subtract;
// typeof 演算子による関数オブジェクトの取得
console.log(typeof addFunction); // "function"
console.log(typeof subtractFunction); // "function"
// ReturnType<T> 型ガードによる戻り値の取得
const addResult: ReturnType<typeof add> = addFunction(5, 3);
console.log(addResult); // 8
const subtractResult: ReturnType<typeof subtract> = subtractFunction(10, 2);
console.log(subtractResult); // 8
解説
- 関数定義
add(x: number, y: number): number
は、number
型の引数2つを受け取り、number
型の戻り値を持つ関数です。
- 関数オブジェクトの取得
const addFunction = add;
は、add
関数オブジェクトをaddFunction
変数に代入します。const subtractFunction = subtract;
は、subtract
関数オブジェクトをsubtractFunction
変数に代入します。
- typeof 演算子による関数オブジェクトの取得
console.log(typeof addFunction);
は、addFunction
変数の型を"function"
と出力します。
- ReturnType<T> 型ガードによる戻り値の取得
const addResult: ReturnType<typeof add> = addFunction(5, 3);
は、addFunction
関数の戻り値の型であるReturnType<typeof add>
型をaddResult
変数に代入し、addFunction
関数を実行して結果を代入します。console.log(addResult);
は、addResult
変数の値を 8 と出力します。
関数を定義する際に、関数シグネチャを明示的に記述することで、戻り値の型情報を取得することができます。
function add(x: number, y: number): number {
return x + y;
}
const addResult: number = add(5, 3);
上記コードでは、add
関数のシグネチャにnumber
型の戻り値の型を明示的に記述しています。そのため、addResult
変数にはnumber
型の型注釈を付けることができます。
ジェネリック型を使用した型推論
ジェネリック型を使用すると、関数の引数と戻り値の型を自動的に推論することができます。
function operate<T>(x: T, y: T, operation: (a: T, b: T) => T): T {
return operation(x, y);
}
const addResult = operate(5, 3, (x, y) => x + y);
const subtractResult = operate(10, 2, (x, y) => x - y);
上記コードでは、operate
関数はジェネリック型パラメータT
を持ち、T
型の引数2つとT
型の戻り値を持つoperation
関数を受け取ります。addResult
とsubtractResult
変数には、operate
関数の戻り値の型であるT
型の型注釈を付けることができます。
型注釈ライブラリの使用
@types/node
などの型注釈ライブラリを使用すると、組み込み関数の型情報を取得することができます。
import * as fs from 'fs';
const readFileResult: string = fs.readFileSync('myfile.txt', 'utf8');
上記コードでは、fs
モジュールからreadFileSync
関数をインポートし、readFileResult
変数にstring
型の型注釈を付けています。これは、@types/node
ライブラリがreadFileSync
関数の戻り値の型をstring
として定義しているためです。
これらの方法は、状況に応じて使い分けることができます。
typescript