0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【TypeScript】メソッド(関数)を含むオブジェクトの型定義

Posted at

初歩的な内容ですが、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;
}

以上です。間違い等あればご教示いただけると幸いです。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?