現時点では、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;
}
インターフェイス定義でゲッターとセッターを使用できる他の方法はありますか?
インターフェイスでプロパティを指定できますが、次のようにゲッターとセッターを使用するかどうかを強制することはできません。
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';
}
他の答えを補足するために、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");
}
}
推奨されないプラクティス;しかし、オプション。
まず、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スタイルのゲッターメソッドを必要とするインターフェイスを選択しました。ただし、プロパティを設定してから、クラスにインターフェースの実装方法を決定させることもできます。
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 の例を参照してください。