TypeScriptで関数オブジェクトを作成する方法
TypeScriptでプロパティを持つ関数オブジェクトを作成する方法
作成方法
TypeScriptでプロパティを持つ関数オブジェクトを作成するには、いくつかの方法があります。 以下に、最も一般的な方法をいくつか紹介します。
オブジェクトリテラルを使用する
最も単純な方法は、オブジェクトリテラルを使用して関数オブジェクトを作成することです。 以下に例を示します。
function greet(name: string): string {
return `こんにちは、${name} さん!`;
}
const person = {
name: "山田 太郎",
greet: greet
};
console.log(person.greet(person.name)); // こんにちは、山田 太郎 さん!
この例では、greet
関数は name
プロパティを持つオブジェクト person
にプロパティとして格納されています。 これは、person.greet
を介して greet
関数を呼び出すことができることを意味します。
インターフェースを使用する
より複雑な関数オブジェクトを作成する場合、インターフェースを使用してその構造を定義することができます。 以下に例を示します。
interface Person {
name: string;
greet(): string;
}
function createPerson(name: string): Person {
return {
name,
greet() {
return `こんにちは、${name} さん!`;
}
};
}
const person = createPerson("山田 太郎");
console.log(person.greet()); // こんにちは、山田 太郎 さん!
この例では、Person
インターフェースは、name
プロパティと greet
メソッドを持つオブジェクトの構造を定義します。 createPerson
関数は、このインターフェースを実装する新しい Person
オブジェクトを作成して返します。
クラスを使用する
さらに複雑な場合、クラスを使用して関数オブジェクトを作成することができます。 以下に例を示します。
class Person {
constructor(public name: string) {}
greet(): string {
return `こんにちは、${this.name} さん!`;
}
}
const person = new Person("山田 太郎");
console.log(person.greet()); // こんにちは、山田 太郎 さん!
この例では、Person
クラスは、name
プロパティと greet
メソッドを持つオブジェクトを表します。 new Person
を使用して新しい Person
オブジェクトを作成することができます。
利点
関数オブジェクトを使用する利点は次のとおりです。
- 保守性
コードをより明確で保守しやすくなります。 - 再利用性
関数オブジェクトをさまざまな場所で再利用できます。
function greet(name: string): string {
return `こんにちは、${name} さん!`;
}
const person = {
name: "山田 太郎",
greet: greet
};
console.log(person.greet(person.name)); // こんにちは、山田 太郎 さん!
説明
interface Person {
name: string;
greet(): string;
}
function createPerson(name: string): Person {
return {
name,
greet() {
return `こんにちは、${name} さん!`;
}
};
}
const person = createPerson("山田 太郎");
console.log(person.greet()); // こんにちは、山田 太郎 さん!
class Person {
constructor(public name: string) {}
greet(): string {
return `こんにちは、${this.name} さん!`;
}
}
const person = new Person("山田 太郎");
console.log(person.greet()); // こんにちは、山田 太郎 さん!
以下の例は、関数オブジェクトをより複雑な方法で使用する方法を示しています。
関数オブジェクトをネストする
interface Person {
name: string;
greet(): string;
introduce(): string;
}
function createPerson(name: string): Person {
return {
name,
greet() {
return `こんにちは、${name} さん!`;
},
introduce() {
return `私は ${name} です。`;
}
};
}
const person = createPerson("山田 太郎");
console.log(person.greet()); // こんにちは、山田 太郎 さん!
console.log(person.introduce()); // 私は 山田 太郎 です。
関数オブジェクトを使用してコールバックを実装する
function forEach(array: any[], callback: (item: any) => void): void {
for (const item of array) {
callback(item);
}
}
const numbers = [1, 2, 3, 4, 5];
forEach(numbers, (n) => console.log(n * 2)); // 2 4 6 8 10
function decorate(target: any, property: string, descriptor: PropertyDescriptor) {
const originalMethod = descriptor.value;
descriptor.value = function (...args: any[]) {
console.log(`装飾者: ${property} メソッドが呼び出されました。`);
return originalMethod.apply(this, args);
};
}
class Person {
@decorate
greet(name: string): string {
return `こんにちは、${name} さん!`;
}
}
const person = new Person();
console.log(person.greet("山田 太郎")); // 装飾者: greet メソッドが呼び出されました。
// こんにちは、山田 太郎 さん!
TypeScript には、関数オブジェクトを作成するのに役立ついくつかの高度な関数があります。 例を次に示します。
omit
: オブジェクトからプロパティのサブセットを除外できる関数です。partial
: 関数の引数のサブセットのみを指定できる関数です。
これらの関数を組み合わせることで、さまざまな種類の関数オブジェクトを作成できます。
例
function greet(name: string, message: string): string {
return `${message}, ${name} さん!`;
}
const partialGreet = partial(greet, undefined, "こんにちは");
console.log(partialGreet("山田 太郎")); // こんにちは、山田 太郎
この例では、partial
関数を使用して、greet
関数の引数のサブセットのみを指定する partialGreet
関数を作成します。
ジェネリックを使用する
ジェネリックを使用して、さまざまな型の関数オブジェクトを作成できます。
interface Identity<T> {
(value: T): T;
}
function identity<T>(value: T): T {
return value;
}
const stringIdentity: Identity<string> = identity;
console.log(stringIdentity("TypeScript")); // TypeScript
const numberIdentity: Identity<number> = identity;
console.log(numberIdentity(10)); // 10
この例では、Identity
ジェネリックインターフェースは、引数と戻り値の型が同じである関数を定義します。 identity
関数は、このインターフェースを実装するジェネリック関数です。
シンボルを使用する
シンボルを使用して、ユニークなプロパティキーを持つ関数オブジェクトを作成できます。
const greetSymbol = Symbol("greet");
function greet(name: string): string {
return `こんにちは、${name} さん!`;
}
const person = {
[greetSymbol]: greet
};
console.log(person[greetSymbol]("山田 太郎")); // こんにちは、山田 太郎
この例では、greetSymbol
シンボルは、greet
関数のユニークなプロパティキーとして使用されます。
casting typescript function-object