web-dev-qa-db-ja.com

インターフェイス定義でゲッター/セッターを使用することは可能ですか?

現時点では、TypeScriptでは、インターフェイスでget/setメソッド(アクセサ)を使用できません。例えば:

interface I {
      get name():string;
}

class C implements I {
      get name():string {
          return null;
      } 
}

さらに、TypeScriptでは、クラスメソッドで配列関数式を使用できません:例:

class C {
    private _name:string;

    get name():string => this._name;
}

インターフェイス定義でゲッターとセッターを使用できる他の方法はありますか?

71
Ivan Popov

インターフェイスでプロパティを指定できますが、次のようにゲッターとセッターを使用するかどうかを強制することはできません。

interface IExample {
    Name: string;
}

class Example implements IExample {
    private _name: string = "Bob";

    public get Name() {
        return this._name;
    }

    public set Name(value) {
        this._name = value;
    }
}

var example = new Example();
alert(example.Name);

この例では、インターフェイスはクラスにゲッターとセッターの使用を強制しません。代わりにプロパティを使用することもできます(下の例を参照)。呼べるものについて。

interface IExample {
    Name: string;
}

class Example implements IExample {
    // this satisfies the interface just the same
    public Name: string = "Bob";
}

var example = new Example();
alert(example.Name);

そして最後に、 =>は、クラスメソッドには許可されていません。 Codeplexの議論を開始する 燃えるユースケースがあると思われる場合。以下に例を示します。

class Test {
    // Yes
    getName = () => 'Steve';

    // No
    getName() => 'Steve';

    // No
    get name() => 'Steve';
}
100
Fenton

他の答えを補足するために、get valueインターフェイスでは、readonlyを使用できます。

interface Foo {
  readonly value: number;
}

let foo: Foo = { value: 10 };

foo.value = 20; //error

class Bar implements Foo {
  get value() {
    return 10;
  }
}

しかし、私が知っている限り、および他の人が述べたように、現在、インターフェイスでセットのみのプロパティを定義する方法はありません。ただし、実行時エラーに制限を移動することはできます(開発サイクル中のみ有用):

interface Foo {
  /* Set Only! */
  value: number;
}

class Bar implements Foo {
  _value:number;
  set value(value: number) {
    this._value = value;
  }
  get value() {
    throw Error("Not Supported Exception");
  }
}

推奨されないプラクティス;しかし、オプション。

27
Meirion Hughes

まず、TypeScriptはEcmascript 5を対象とする場合、getおよびset構文のみをサポートします。これを実現するには、コンパイラーを次のように呼び出す必要があります。

tsc --target ES5

インターフェイスはゲッターとセッターをサポートしていません。コードをコンパイルするには、次のように変更する必要があります

interface I { 
    getName():string;
}

class C implements I { 
    getName():string {
          return null;
    }   
}

TypeScriptがサポートするのは、コンストラクター内のフィールドの特別な構文です。あなたの場合、あなたが持つことができる

interface I {
    getName():string;
}

class C implements I {
    constructor(public name: string) {
    }
    getName():string {
        return name;
    }
}

クラスCがフィールドnameを指定していないことに注意してください。実際には、構文糖を使用して宣言されていますpublic name: stringコンストラクター。

Sohneeが指摘しているように、インターフェースは実際には実装の詳細を隠すことになっています。この例では、Javaスタイルのゲッターメソッドを必要とするインターフェイスを選択しました。ただし、プロパティを設定してから、クラスにインターフェースの実装方法を決定させることもできます。

2
Valentin

TypeScript 3.4の使用:

interface IPart {
    getQuantity(): number;
}

class Part implements IPart {
    private quantity: number;
    constructor(quantity: number) {
        this.quantity = quantity;
    }
    public getQuantity = (): number => {
        return this.quantity;
    };
}

let part = new Part(42);

// When used in TypeScript, quantity is not accessible.
// However, when compiled to javascript it will log '42'.
console.log(part.quantity);

// Logs '42'.
console.log(part.getQuantity());

TypeScript Playground の例を参照してください。

0
Jack