TypeScript で型を拡張する

Rana Hasnain Khan 2023年6月21日
TypeScript で型を拡張する

この記事は、いくつかの例を使用して、TypeScript で型を拡張する方法を理解するのに役立ちます。

TypeScript で型を拡張する

残念ながら、TypeScript では型を拡張することはできません。 Interfaceclass のみを拡張できます。

インターフェイスまたはクラスを使用して、型を指定し、それらを拡張できます。 例を見て、型のインターフェースを拡張しようとします。

以下で説明する 2つのメソッドを含む Project というインターフェイスがあります。

1つは submit() と呼ばれ、2 番目は queue() と呼ばれます。

interface Project {
    submit(data: string): boolean
    queue(data: string): boolean
}

project インターフェイスを使用する多くのクラスがあります。 要件を送信する project インターフェイスの新しいメソッドを使用する必要があります。

Requirements(data: string, id: number): void

project インターフェイスを使用して現在のコードを中断したい場合、TypeScript は使用可能な later() メソッドを提供します。 これを回避することで、project インターフェイスを拡張する新しいインターフェイスを作成できます。

interface ProjectManagement extends Project {
    Requirements(data: string, id: number): boolean
}

extends キーワードを使用して、この構文でインターフェイスを拡張できます。

interface D {
    d(): void
}
interface K extends D {
    k(): void
}

インターフェース K はインターフェース D を拡張します。 どちらもメソッド d()k() を持っています。

ProjectManagement インターフェイスは、クラスのように project インターフェイスから submit() メソッドと queue() メソッドの 2つのメソッドを引き継ぎます。

class PM implements ProjectManagement {
    Requirements(data: string, id: number): boolean {
        console.log(`Send data to ${id} in ${sec} ms.`);
        return true;
    }
    submit(data: string): boolean {
        console.log(`Sent data to ${id} after ${sec} ms. `);
        return true;
    }
    queue(data: string): boolean {
        console.log(`Queue an project to ${id}.`);
        return true;
    }
}

TypeScript で複数のインターフェイスを拡張するインターフェイス

インターフェイスは、多くのインターフェイスを拡張し、すべてのインターフェイスの混合物を作成できます。 例の助けを借りて議論しましょう。

interface A {
    a(): void
}
interface E {
    e(): void
}
interface M extends E, A {
    m(): void
}

インターフェース M がインターフェース EA を拡張していることがわかります。 M には、すべての E および A インターフェイス メソッド、a() および e() があります。

TypeScript でクラスを拡張するインターフェイス

インターフェイスは、クラスのプロパティとメソッドを引き継ぎます。 TypeScript は、クラスを拡張するためのインターフェイスを付与します。

インターフェイスは、クラスのプライベート メンバーと保護されたメンバーを引き継ぎます。 インターフェイスは、パブリック メンバーのみを引き継ぐことはできません。

そのクラスのインターフェースは、インターフェースの拡張元のクラスまたはサブクラスによってのみ実装できます。 これは、インターフェイスがプライベートまたは保護されたメンバーでクラスを拡張する場合を意味します。

インターフェイスが引き継ぐクラスのサブクラスではないクラスからインターフェイスを実装すると、エラーが発生します。

以下に例を示します。

class Key {
    private value: boolean;
}
interface Lock extends Key {
    enable(): void
}
class FingerPrint extends Key implements Lock {
    enable() { }
}
class Notification extends Key implements Lock {
    enable() { }
}
class Identity extends Key { }{
    enable() { }
}

インターフェイスは、1つまたは複数の既存のインターフェイスを拡張できます。 クラスまたはサブクラスは、そのクラスのインターフェースのみを実装できます。

Rana Hasnain Khan avatar Rana Hasnain Khan avatar

Rana is a computer science graduate passionate about helping people to build and diagnose scalable web application problems and problems developers face across the full-stack.

LinkedIn