120

現時点で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;
}

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

4

4 に答える 4

144

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

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の非常に優れたユースケースがあると思われる場合は、Codeplexに関するディスカッションを開始できます。次に例を示します。

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

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

    // No
    get name() => 'Steve';
}
于 2012-10-11T12:03:52.933 に答える
60

他の回答を補足するため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");
  }
}

推奨されない方法。しかし、オプション。

于 2016-12-13T11:32:38.317 に答える
2

まず第一に、Ecmascript 5 を対象とする場合、Typescriptはgetand構文のみをサポートします。これを実現するには、次のようにコンパイラを呼び出す必要があります。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;
    }
}

classCが field を指定していないことに注意してくださいname。実際にはpublic name: string、コンストラクターでシンタックス シュガーを使用して宣言されています。

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

于 2012-10-11T11:45:54.047 に答える
0

Using 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());

See example on TypeScript Playground.

于 2019-05-25T14:30:48.713 に答える