Rush Stackショップブログイベント
本文へスキップ

ae-missing-getter

"プロパティ"___にはセッターがありますが、ゲッターがありません。

備考

TypeScriptのプロパティは、一般的に変数の読み書きと同様の動作をするAPIを示すために使用されます。たとえば、スタイルガイドでは多くの場合、以下のように推奨されています。

  • プロパティゲッターは、高価な/複雑な操作を実行するべきではありません。
  • プロパティゲッターは、観測可能な副作用を引き起こすべきではありません(例:プロパティを読み取ると、ストリームポインタが前方へ移動する)。
  • プロパティゲッターは、例外をスローするのを避けるべきです。

同様に、セッターのないプロパティゲッターを宣言するのは奇妙です。変数に値を代入した後、開発者は直感的に代入された値を読み取れることを期待します。

この例を考えてみましょう。

/**
* Represents a book from the catalog.
* @public
*/
export class Book {
private _title: string = 'untitled';

/**
* Sets the title of the book.
*/
// Error: (ae-missing-getter) The property "title" has a setter but no getter.
public set title(value: string) {
this._title = value;
}
}

const book: Book = new Book();
book.title = 'The Hobbit';
console.log('The title: ' + book.title); // prints "The title: undefined"

上記の動作は直感に反します。欠落しているセッターは、API設計のミスである可能性が高いです。API Extractorはae-missing-getterエラーを報告します。

修正方法

最も簡単な解決策は、欠落しているプロパティゲッターを実装することです。ゲッターのドキュメントは両方の操作について記述していることに注意してください。プロパティセッターにはドキュメントコメントを含めることはできません。

/**
* Represents a book from the catalog.
* @public
*/
export class Book {
private _title: string = 'untitled';

/**
* Gets or sets the title of the book.
*/
public get title(): string {
return this._title;
}

public set title(value: string) {
this._title = value;
}
}

const book: Book = new Book();
book.title = 'The Hobbit';
console.log('Title: ' + book.title); // prints "Title: The Hobbit"

あるいは、APIを本当に一方向の操作にする必要がある場合は、プロパティではなくメソッドとして設計する必要があります。

/**
* Represents a book from the catalog.
* @public
*/
export class Book {
private _title: string = 'untitled';

/**
* Sets the title of the book.
*/
public setTitle(title: string): void {
this._title = title;
}
}

"継承された"ゲッターに関連する落とし穴

ae-missing-getter検証を無効にする場合は、継承されたプロパティに注意してください。子クラスがセッターのみを指定してプロパティをオーバーライドする場合、ゲッターは未定義になります。他の言語とは異なり、ECMAScriptのgetおよびset属性は、オーバーライドされる単一のアクセサープロパティを構成します。このプレイグラウンドリンクを参照してください。

参照