初歩的な内容ですが、TypeScript でメソッド(関数)を含むオブジェクトの型定義について書いておきます。
1. メソッドを含むオブジェクトの型定義
1-1. サンプルコード
sample.ts
type SampleType = {
name: string;
age: number;
greeting: () => string;
}
greeting: () => string;
のところが、メソッドとなります。
1-2. メソッドの型定義のパターン
戻り値がない場合は、次のように指定します。
greeting: () => void;
引数を含む場合は、次のように指定します。
greeting: (name: string, age: number) => string;
とても簡単ですが、答えに辿り着くまでに少々時間が掛かったので、同じことに迷う方が減るように書いておきました。
2. 補足
以下は、おおよそ個人的見解ですが、参考のため書いておきます。
2-1. データ型が不明なクラスの型定義
本来、あるべき形ではないと思いますが、使用しているクラスのデータ型が不明の場合についてです。
以下のサンプルでは、クラスに対して後付けで型定義をしています(これで安全かどうかは要検討です)。
sample.ts
// クラスの実態(この型が不明!の場合)
class SampleClass {
name: string;
age: number;
constructor(name: string, age: number) {
this.name = name;
this.age = age;
}
greeting(): string {
return `私の名前は${this.name}です。年齢は${this.age}歳です。`
};
}
// クラスの型を定義する(既知の内容を元に定義する)
type SampleType = {
name: string;
age: number;
greeting?: () => string; // メソッドが存在するか不明の場合
}
// 定義した型(SampleType)を用いてインスタンスを生成
const taro: SampleType = new SampleClass('taro', 30);
// メソッドの存在有無を確認の上で実行する
if (taro.greeting) {
console.log(taro.greeting()); // 私の名前はtaroです。年齢は30歳です。
}
2-2. 関数の型指定の方法
関数の型は、以下の typeof greeting
のように「typeof 関数名
」の形で定義することもできます。
sample.ts
// 使用される関数
function greeting(name: string, age: number): string {
return `私の名前は${name}です。年齢は${age}歳です。`;
}
// オブジェクト内のメソッドとして定義
type SampleType2 = {
greeting: typeof greeting;
}
使用する場面があるかは分かりませんが、次のように定義することもできます。
sample.ts
// 使用される関数
function greeting(name: string, age: number): string {
return `私の名前は${name}です。年齢は${age}歳です。`;
}
// 関数の引数と戻り値の型を取得
type SampleParameters = Parameters<typeof greeting>; // 引数の型
type SampleReturnType = ReturnType<typeof greeting>; // 戻り値の型
// オブジェクト内のメソッドとして定義
type SampleType = {
greeting: (...param: SampleParameters) => SampleReturnType;
}
以上です。間違い等あればご教示いただけると幸いです。