1. ホーム
  2. タイプスクリプト

[解決済み】TypeScriptで抽象的なメソッドを宣言する

2022-04-05 13:46:28

質問

TypeScriptで抽象的なメソッドを正しく定義する方法を考えています。

元の継承の例を使って

class Animal {
    constructor(public name) { }
    makeSound(input : string) : string;
    move(meters) {
        alert(this.name + " moved " + meters + "m.");
    }
}

class Snake extends Animal {
    constructor(name) { super(name); }
    makeSound(input : string) : string {
        return "sssss"+input;
    }
    move() {
        alert("Slithering...");
        super.move(5);
    }
}

メソッドmakeSoundを正しく定義する方法を知りたいのですが、型付けされており、オーバーライドが可能です。

また、正しい定義がわかりません。 protected キーワードのように見えますが、何の効果もなく、コードはコンパイルされません。

どのように解決するのですか?

その name プロパティは、以下のようにマークされます。 protected . これはTypeScript 1.3で追加されたもので、現在では定着しています。

makeSound メソッドがマークされています。 abstract クラスと同様です。を直接インスタンス化することはできません。 Animal は抽象的であるため、現在では これはTypeScript 1.6に含まれるものです 現在、正式に稼動しています。

abstract class Animal {
    constructor(protected name: string) { }

    abstract makeSound(input : string) : string;

    move(meters) {
        alert(this.name + " moved " + meters + "m.");
    }
}

class Snake extends Animal {
    constructor(name: string) { super(name); }

    makeSound(input : string) : string {
        return "sssss"+input;
    }

    move() {
        alert("Slithering...");
        super.move(5);
    }
}

抽象的なメソッドを模倣する古い方法は、誰かがそれを使用した場合にエラーをスローすることでした。TypeScript 1.6がプロジェクトに導入されれば、もうこの方法は必要なくなるはずだ。

class Animal {
    constructor(public name) { }
    makeSound(input : string) : string {
        throw new Error('This method is abstract');
    }
    move(meters) {
        alert(this.name + " moved " + meters + "m.");
    }
}

class Snake extends Animal {
    constructor(name) { super(name); }
    makeSound(input : string) : string {
        return "sssss"+input;
    }
    move() {
        alert("Slithering...");
        super.move(5);
    }
}