メインコンテンツへスキップ

member-ordering

メンバー宣言の順序の一貫性を要求します。

このルールは、クラス、インターフェース、および型リテラルの構造化と順序付けの方法を標準化することを目的としています。フィールド、メソッド、コンストラクターの順序が一貫していると、コードが読みやすく、ナビゲートしやすく、編集しやすくなります。

注意

このルールは機能フリーズされています。新しいオプションなどの新機能は追加されません。既存の機能範囲については、バグ修正とドキュメント修正は引き続き受け付けます。

命名規則やソート規則を強制するスタイルのルールは、ますます曖昧な機能が要求されるにつれて、理解不能なほど複雑になる傾向があります。このルールは、typescript-eslint プロジェクトが維持できる範囲の限界に達しました。詳細については、eslint-plugin: 命名およびソートスタイルのルールの機能フリーズを参照してください。

.eslintrc.cjs
module.exports = {
"rules": {
"@typescript-eslint/member-ordering": "error"
}
};

プレイグラウンドでこのルールを試す ↗

オプション

interface Options {
default?: OrderConfig;
classes?: OrderConfig;
classExpressions?: OrderConfig;
interfaces?: OrderConfig;
typeLiterals?: OrderConfig;
}

type OrderConfig = MemberType[] | SortedOrderConfig | 'never';

interface SortedOrderConfig {
memberTypes?: MemberType[] | 'never';
optionalityOrder?: 'optional-first' | 'required-first';
order?:
| 'alphabetically'
| 'alphabetically-case-insensitive'
| 'as-written'
| 'natural'
| 'natural-case-insensitive';
}

// See below for the more specific MemberType strings
type MemberType = string | string[];

OrderConfigオプションは以下に対して設定できます。

  • default: すべての構成要素 (フォールバックとして使用)
  • classes?: クラス固有の順序をオーバーライド
  • classExpressions?: クラス式固有の順序をオーバーライド
  • interfaces?: インターフェース固有の順序をオーバーライド
  • typeLiterals?: 型リテラル固有の順序をオーバーライド

各種類の構成要素に対する OrderConfig 設定では、最大3つのレベルでソートを設定できます

  • memberTypes: メソッドとプロパティなどのメンバータイプグループで編成
  • optionalityOrder: すべてのオプションメンバーを最初に配置するか、すべての必須メンバーを最初に配置するか
  • order: メンバー名に基づいて編成(アルファベット順など)

グループ

メンバーのさまざまな属性に基づいて、さまざまなグループを定義できます。サポートされているメンバー属性は、次の順序で

  • アクセス可能性 ('public' | 'protected' | 'private' | '#private')
  • デコレーション ('decorated'): メンバーに明示的なアクセシビリティデコレーターがあるかどうか
  • 種類 ('call-signature' | 'constructor' | 'field' | 'readonly-field' | 'get' | 'method' | 'set' | 'signature' | 'readonly-signature')

メンバー属性は、'-'で結合して、より具体的なグループに組み合わせることができます。たとえば、'public-field''private-field'の前に来ます。

順序

orderの値は、グループ内でメンバーがどのような順序であるべきかを指定します。デフォルトはas-writtenで、順序は任意であることを意味します。その他の許可されている値は次のとおりです。

  • alphabetically: 文字列の<比較を直接使用して、a-zのアルファベット順にソートされます (したがって、Baの前に来ます)
  • alphabetically-case-insensitive: 大文字と小文字を区別せずに、a-zのアルファベット順にソートされます (したがって、aBの前に来ます)
  • natural: alphabeticallyと同じですが、数値のよりわかりやすいソートにはnatural-compare-liteを使用します。
  • natural-case-insensitive: alphabetically-case-insensitiveと同じですが、数値のよりわかりやすいソートにはnatural-compare-liteを使用します。

デフォルト設定

デフォルト設定は次のようになります。

{
"default": {
"memberTypes": [
// Index signature
"signature",
"call-signature",

// Fields
"public-static-field",
"protected-static-field",
"private-static-field",
"#private-static-field",

"public-decorated-field",
"protected-decorated-field",
"private-decorated-field",

"public-instance-field",
"protected-instance-field",
"private-instance-field",
"#private-instance-field",

"public-abstract-field",
"protected-abstract-field",

"public-field",
"protected-field",
"private-field",
"#private-field",

"static-field",
"instance-field",
"abstract-field",

"decorated-field",

"field",

// Static initialization
"static-initialization",

// Constructors
"public-constructor",
"protected-constructor",
"private-constructor",

"constructor",

// Accessors
"public-static-accessor",
"protected-static-accessor",
"private-static-accessor",
"#private-static-accessor",

"public-decorated-accessor",
"protected-decorated-accessor",
"private-decorated-accessor",

"public-instance-accessor",
"protected-instance-accessor",
"private-instance-accessor",
"#private-instance-accessor",

"public-abstract-accessor",
"protected-abstract-accessor",

"public-accessor",
"protected-accessor",
"private-accessor",
"#private-accessor",

"static-accessor",
"instance-accessor",
"abstract-accessor",

"decorated-accessor",

"accessor",

// Getters
"public-static-get",
"protected-static-get",
"private-static-get",
"#private-static-get",

"public-decorated-get",
"protected-decorated-get",
"private-decorated-get",

"public-instance-get",
"protected-instance-get",
"private-instance-get",
"#private-instance-get",

"public-abstract-get",
"protected-abstract-get",

"public-get",
"protected-get",
"private-get",
"#private-get",

"static-get",
"instance-get",
"abstract-get",

"decorated-get",

"get",

// Setters
"public-static-set",
"protected-static-set",
"private-static-set",
"#private-static-set",

"public-decorated-set",
"protected-decorated-set",
"private-decorated-set",

"public-instance-set",
"protected-instance-set",
"private-instance-set",
"#private-instance-set",

"public-abstract-set",
"protected-abstract-set",

"public-set",
"protected-set",
"private-set",
"#private-set",

"static-set",
"instance-set",
"abstract-set",

"decorated-set",

"set",

// Methods
"public-static-method",
"protected-static-method",
"private-static-method",
"#private-static-method",

"public-decorated-method",
"protected-decorated-method",
"private-decorated-method",

"public-instance-method",
"protected-instance-method",
"private-instance-method",
"#private-instance-method",

"public-abstract-method",
"protected-abstract-method",

"public-method",
"protected-method",
"private-method",
"#private-method",

"static-method",
"instance-method",
"abstract-method",

"decorated-method",

"method",
],
},
}
注意

デフォルト設定には、他のメンバータイプを含むメンバーグループタイプが含まれています。これは、より良いエラーメッセージを提供するための意図的なものです。

ヒント

デフォルトでは、メンバーはソートされません。アルファベット順にソートする場合は、カスタム設定を行う必要があります。

すべての構成要素の一般的な順序

この設定は、すべての構成要素の順序を指定します。シグネチャ、メソッド、コンストラクター、およびフィールド以外のメンバータイプは無視します。また、アクセシビリティとスコープも無視します。

// .eslintrc.json
{
"rules": {
"@typescript-eslint/member-ordering": [
"error",
{ "default": ["signature", "method", "constructor", "field"] },
],
},
}
interface Foo {
B: string; // -> field

new (); // -> constructor

A(): void; // -> method

[Z: string]: any; // -> signature
}
プレイグラウンドで開く
type Foo = {
B: string; // -> field

// no constructor

A(): void; // -> method

// no signature
};
プレイグラウンドで開く
class Foo {
private C: string; // -> field
public D: string; // -> field
protected static E: string; // -> field

constructor() {} // -> constructor

public static A(): void {} // -> method
public B(): void {} // -> method

[Z: string]: any; // -> signature
}
プレイグラウンドで開く
const Foo = class {
private C: string; // -> field
public D: string; // -> field

constructor() {} // -> constructor

public static A(): void {} // -> method
public B(): void {} // -> method

[Z: string]: any; // -> signature

protected static E: string; // -> field
};
プレイグラウンドで開く

クラス

パブリックインスタンスメソッドをパブリック静的フィールドの前に配置する

この設定は、パブリックインスタンスメソッドをパブリック静的フィールドの前に配置する必要があることを指定します。その他はどこに配置しても構いません。アクセシビリティとスコープがインターフェースまたは型リテラルの一部ではないため、インターフェースや型リテラルには適用されません。

// .eslintrc.json
{
"rules": {
"@typescript-eslint/member-ordering": [
"error",
{ "default": ["public-instance-method", "public-static-field"] },
],
},
}
class Foo {
private C: string; // (irrelevant)

public D: string; // (irrelevant)

public static E: string; // -> public static field

constructor() {} // (irrelevant)

public static A(): void {} // (irrelevant)

[Z: string]: any; // (irrelevant)

public B(): void {} // -> public instance method
}
プレイグラウンドで開く
const Foo = class {
private C: string; // (irrelevant)

[Z: string]: any; // (irrelevant)

public static E: string; // -> public static field

public D: string; // (irrelevant)

constructor() {} // (irrelevant)

public static A(): void {} // (irrelevant)

public B(): void {} // -> public instance method
};
プレイグラウンドで開く

インスタンスフィールドより前の静的フィールド

この設定は、静的フィールドがインスタンスフィールドの前に来るように指定し、パブリックな静的フィールドが最初に配置されます。インターフェースや型リテラルには適用されません。なぜなら、アクセシビリティとスコープはそれらの一部ではないからです。

{
"rules": {
"@typescript-eslint/member-ordering": [
"error",
{ "default": ["public-static-field", "static-field", "instance-field"] },
],
},
}
class Foo {
private E: string; // -> instance field

private static B: string; // -> static field
protected static C: string; // -> static field
private static D: string; // -> static field

public static A: string; // -> public static field

[Z: string]: any; // (irrelevant)
}
プレイグラウンドで開く
const foo = class {
public T(): void {} // method (irrelevant)

private static B: string; // -> static field

constructor() {} // constructor (irrelevant)

private E: string; // -> instance field

protected static C: string; // -> static field
private static D: string; // -> static field

[Z: string]: any; // signature (irrelevant)

public static A: string; // -> public static field
};
プレイグラウンドで開く

クラス宣言

この設定は、クラスの順序のみを指定します。まずメソッド、次にコンストラクター、最後にフィールドとなります。クラス式には適用されません(クラス式にはclassExpressionsを使用してください)。クラス宣言とクラス宣言以外のすべての構文構造には、デフォルト設定が使用されます。

// .eslintrc.json
{
"rules": {
"@typescript-eslint/member-ordering": [
"error",
{ "classes": ["method", "constructor", "field"] },
],
},
}
class Foo {
private C: string; // -> field
public D: string; // -> field
protected static E: string; // -> field

constructor() {} // -> constructor

public static A(): void {} // -> method
public B(): void {} // -> method
}
プレイグラウンドで開く

クラス式

この設定は、クラス式の順序のみを指定します。まずメソッド、次にコンストラクター、最後にフィールドとなります。クラス宣言には適用されません(クラス宣言にはclassesを使用してください)。クラス宣言とクラス式以外のすべての構文構造には、デフォルト設定が使用されます。

// .eslintrc.json
{
"rules": {
"@typescript-eslint/member-ordering": [
"error",
{ "classExpressions": ["method", "constructor", "field"] },
],
},
}
const foo = class {
private C: string; // -> field
public D: string; // -> field
protected static E: string; // -> field

constructor() {} // -> constructor

public static A(): void {} // -> method
public B(): void {} // -> method
};
プレイグラウンドで開く

インターフェース

この設定は、インターフェースの順序のみを指定します。まずシグネチャ、次にメソッド、次にコンストラクター、最後にフィールドとなります。型リテラルには適用されません(型リテラルにはtypeLiteralsを使用してください)。型リテラルとクラス式以外のすべての構文構造には、デフォルト設定が使用されます。

注意

これらのメンバー型は、interfaces で許可されている唯一のものです。

// .eslintrc.json
{
"rules": {
"@typescript-eslint/member-ordering": [
"error",
{ "interfaces": ["signature", "method", "constructor", "field"] },
],
},
}
interface Foo {
B: string; // -> field

new (); // -> constructor

A(): void; // -> method

[Z: string]: any; // -> signature
}
プレイグラウンドで開く

型リテラル

この設定は、型リテラルの順序のみを指定します。まずシグネチャ、次にメソッド、次にコンストラクター、最後にフィールドとなります。インターフェースには適用されません(インターフェースにはinterfacesを使用してください)。インターフェースとクラス式以外のすべての構文構造には、デフォルト設定が使用されます。

注意

これらのメンバー型は、typeLiterals で許可されている唯一のものです。

// .eslintrc.json
{
"rules": {
"@typescript-eslint/member-ordering": [
"error",
{ "typeLiterals": ["signature", "method", "constructor", "field"] },
],
},
}
type Foo = {
B: string; // -> field

A(): void; // -> method

new (); // -> constructor

[Z: string]: any; // -> signature
};
プレイグラウンドで開く

ソートオプション

メンバーグループ内でのアルファベット順ソート

memberTypesが指定されていない場合、デフォルトのメンバー順が適用されます。デフォルトの順序は、デフォルト設定で確認できます。

// .eslintrc.json
{
"rules": {
"@typescript-eslint/member-ordering": [
"error",
{
"default": {
"order": "alphabetically",
},
},
],
},
}
interface Foo {
a: x;
B: x;
c: x;

B(): void;
c(): void;
a(): void;
}
プレイグラウンドで開く

カスタムメンバーグループ内でのアルファベット順ソート

この設定は、各カスタムmemberTypesグループ内で、メンバーが大文字と小文字を区別するアルファベット順になるように指定します。

// .eslintrc.json
{
"rules": {
"@typescript-eslint/member-ordering": [
"error",
{
"default": {
"memberTypes": ["method", "field"],
"order": "alphabetically",
},
},
],
},
}
interface Foo {
B(): void;
c(): void;
a(): void;

a: x;
B: x;
c: x;
}
プレイグラウンドで開く

メンバーグループ内での大文字小文字を区別しないアルファベット順ソート

memberTypesが指定されていない場合、デフォルトのメンバー順が適用されます。デフォルトの順序は、デフォルト設定で確認できます。

// .eslintrc.json
{
"rules": {
"@typescript-eslint/member-ordering": [
"error",
{
"default": {
"order": "alphabetically-case-insensitive",
},
},
],
},
}
interface Foo {
B: x;
a: x;
c: x;

B(): void;
c(): void;
a(): void;
}
プレイグラウンドで開く

メンバーグループを無視したアルファベット順ソート

この設定は、メンバーがすべて大文字と小文字を区別するアルファベット順にソートされるように指定します。memberTypes"never" を指定することで、メンバーグループ型を完全に無視します。

// .eslintrc.json
{
"rules": {
"@typescript-eslint/member-ordering": [
"error",
{ "default": { "memberTypes": "never", "order": "alphabetically" } },
],
},
}
interface Foo {
b(): void;
a: boolean;

[a: string]: number;
new (): Bar;
(): Baz;
}
プレイグラウンドで開く

オプションメンバーを最初または最後にソート

optionalityOrderオプションを有効にすると、グループ内のすべてのオプションメンバーをグループの先頭または末尾に配置できます。

この設定では、すべてのオプションメンバーがすべての必須メンバーの前に配置されます。

// .eslintrc.json
{
"rules": {
"@typescript-eslint/member-ordering": [
"error",
{
"default": {
"optionalityOrder": "optional-first",
"order": "alphabetically",
},
},
],
},
}
interface Foo {
a: boolean;
b?: number;
c: string;
}
プレイグラウンドで開く

この設定では、すべての必須メンバーがすべてのオプションメンバーの前に配置されます。

// .eslintrc.json
{
"rules": {
"@typescript-eslint/member-ordering": [
"error",
{
"default": {
"optionalityOrder": "required-first",
"order": "alphabetically",
},
},
],
},
}
interface Foo {
a: boolean;
b?: number;
c: string;
}
プレイグラウンドで開く

すべてのサポートされるオプション

メンバー型(詳細形式)

メンバー型を指定する方法は複数あります。最も明示的で詳細な形式は次のとおりです。

[
// Index signature
"signature",
"readonly-signature",

// Fields
"public-static-field",
"public-static-readonly-field",
"protected-static-field",
"protected-static-readonly-field",
"private-static-field",
"private-static-readonly-field",
"#private-static-field",
"#private-static-readonly-field",

"public-decorated-field",
"public-decorated-readonly-field",
"protected-decorated-field",
"protected-decorated-readonly-field",
"private-decorated-field",
"private-decorated-readonly-field",

"public-instance-field",
"public-instance-readonly-field",
"protected-instance-field",
"protected-instance-readonly-field",
"private-instance-field",
"private-instance-readonly-field",
"#private-instance-field",
"#private-instance-readonly-field",

"public-abstract-field",
"public-abstract-readonly-field",
"protected-abstract-field",
"protected-abstract-readonly-field",

"public-field",
"public-readonly-field",
"protected-field",
"protected-readonly-field",
"private-field",
"private-readonly-field"
"#private-field",
"#private-readonly-field"

"static-field",
"static-readonly-field",
"instance-field",
"instance-readonly-field"
"abstract-field",
"abstract-readonly-field",

"decorated-field",
"decorated-readonly-field",

"field",
"readonly-field",

// Static initialization
"static-initialization",

// Constructors
"public-constructor",
"protected-constructor",
"private-constructor",

// Getters
"public-static-get",
"protected-static-get",
"private-static-get",
"#private-static-get",

"public-decorated-get",
"protected-decorated-get",
"private-decorated-get",

"public-instance-get",
"protected-instance-get",
"private-instance-get",
"#private-instance-get",

"public-abstract-get",
"protected-abstract-get",

"public-get",
"protected-get",
"private-get",
"#private-get",

"static-get",
"instance-get",
"abstract-get",

"decorated-get",

"get",

// Setters
"public-static-set",
"protected-static-set",
"private-static-set",
"#private-static-set",

"public-decorated-set",
"protected-decorated-set",
"private-decorated-set",

"public-instance-set",
"protected-instance-set",
"private-instance-set",
"#private-instance-set",

"public-abstract-set",
"protected-abstract-set",

"public-set",
"protected-set",
"private-set",

"static-set",
"instance-set",
"abstract-set",

"decorated-set",

"set",

// Methods
"public-static-method",
"protected-static-method",
"private-static-method",
"#private-static-method",
"public-decorated-method",
"protected-decorated-method",
"private-decorated-method",
"public-instance-method",
"protected-instance-method",
"private-instance-method",
"#private-instance-method",
"public-abstract-method",
"protected-abstract-method"
]
注意

可能な型の一部のみを指定した場合、指定されていない型は特定の順序を持つことができます。これは、指定された型の前、中、または後に配置でき、リンターはそれについて文句を言わないことを意味します。

メンバーグループ型(アクセシビリティあり、スコープ無視)

スコープを無視して、メンバー型をアクセシビリティ (staticinstanceabstract) でグループ化することも可能です。

[
// Index signature
// No accessibility for index signature.

// Fields
"public-field", // = ["public-static-field", "public-instance-field"]
"protected-field", // = ["protected-static-field", "protected-instance-field"]
"private-field", // = ["private-static-field", "private-instance-field"]

// Static initialization
// No accessibility for static initialization.

// Constructors
// Only the accessibility of constructors is configurable. See below.

// Getters
"public-get", // = ["public-static-get", "public-instance-get"]
"protected-get", // = ["protected-static-get", "protected-instance-get"]
"private-get", // = ["private-static-get", "private-instance-get"]

// Setters
"public-set", // = ["public-static-set", "public-instance-set"]
"protected-set", // = ["protected-static-set", "protected-instance-set"]
"private-set", // = ["private-static-set", "private-instance-set"]

// Methods
"public-method", // = ["public-static-method", "public-instance-method"]
"protected-method", // = ["protected-static-method", "protected-instance-method"]
"private-method", // = ["private-static-method", "private-instance-method"]
]

メンバーグループ型(アクセシビリティとデコレーター付き)

デコレーターを持つメソッドまたはフィールドを、オプションでアクセシビリティを指定して、個別にグループ化することも可能です。

[
// Index signature
// No decorators for index signature.

// Fields
"public-decorated-field",
"protected-decorated-field",
"private-decorated-field",

"decorated-field", // = ["public-decorated-field", "protected-decorated-field", "private-decorated-field"]

// Static initialization
// No decorators for static initialization.

// Constructors
// There are no decorators for constructors.

// Getters
"public-decorated-get",
"protected-decorated-get",
"private-decorated-get",

"decorated-get", // = ["public-decorated-get", "protected-decorated-get", "private-decorated-get"]

// Setters
"public-decorated-set",
"protected-decorated-set",
"private-decorated-set",

"decorated-set", // = ["public-decorated-set", "protected-decorated-set", "private-decorated-set"]

// Methods
"public-decorated-method",
"protected-decorated-method",
"private-decorated-method",

"decorated-method", // = ["public-decorated-method", "protected-decorated-method", "private-decorated-method"]
]

メンバーグループ型(スコープあり、アクセシビリティ無視)

もう1つのオプションとして、アクセシビリティを無視して、メンバー型をスコープ (publicprotectedprivate) でグループ化することも可能です。

[
// Index signature
// No scope for index signature.

// Fields
"static-field", // = ["public-static-field", "protected-static-field", "private-static-field"]
"instance-field", // = ["public-instance-field", "protected-instance-field", "private-instance-field"]
"abstract-field", // = ["public-abstract-field", "protected-abstract-field"]

// Static initialization
// No scope for static initialization.

// Constructors
"constructor", // = ["public-constructor", "protected-constructor", "private-constructor"]

// Getters
"static-get", // = ["public-static-get", "protected-static-get", "private-static-get"]
"instance-get", // = ["public-instance-get", "protected-instance-get", "private-instance-get"]
"abstract-get", // = ["public-abstract-get", "protected-abstract-get"]

// Setters
"static-set", // = ["public-static-set", "protected-static-set", "private-static-set"]
"instance-set", // = ["public-instance-set", "protected-instance-set", "private-instance-set"]
"abstract-set", // = ["public-abstract-set", "protected-abstract-set"]

// Methods
"static-method", // = ["public-static-method", "protected-static-method", "private-static-method"]
"instance-method", // = ["public-instance-method", "protected-instance-method", "private-instance-method"]
"abstract-method", // = ["public-abstract-method", "protected-abstract-method"]
]

メンバーグループ型(スコープとアクセシビリティ付き)

3番目のグループ化オプションとして、スコープとアクセシビリティの両方を無視することも可能です。

[
// Index signature
// No grouping for index signature.

// Fields
"field", // = ["public-static-field", "protected-static-field", "private-static-field", "public-instance-field", "protected-instance-field", "private-instance-field",
// "public-abstract-field", "protected-abstract-field"]

// Static initialization
// No grouping for static initialization.

// Constructors
// Only the accessibility of constructors is configurable.

// Getters
"get", // = ["public-static-get", "protected-static-get", "private-static-get", "public-instance-get", "protected-instance-get", "private-instance-get",
// "public-abstract-get", "protected-abstract-get"]

// Setters
"set", // = ["public-static-set", "protected-static-set", "private-static-set", "public-instance-set", "protected-instance-set", "private-instance-set",
// "public-abstract-set", "protected-abstract-set"]

// Methods
"method", // = ["public-static-method", "protected-static-method", "private-static-method", "public-instance-method", "protected-instance-method", "private-instance-method",
// "public-abstract-method", "protected-abstract-method"]
]

メンバーグループ型(読み取り専用フィールド)

フィールドを readonly 修飾子でグループ化することが可能です。

[
// Index signature
"readonly-signature",
"signature",

// Fields
"readonly-field", // = ["public-static-readonly-field", "protected-static-readonly-field", "private-static-readonly-field", "public-instance-readonly-field", "protected-instance-readonly-field", "private-instance-readonly-field", "public-abstract-readonly-field", "protected-abstract-readonly-field"]
"field", // = ["public-static-field", "protected-static-field", "private-static-field", "public-instance-field", "protected-instance-field", "private-instance-field", "public-abstract-field", "protected-abstract-field"]
]

同じランクでの異なるメンバー型のグループ化

同じランクで異なるメンバー型をグループ化することも可能です。

[
// Index signature
"signature",

// Fields
"field",

// Static initialization
"static-initialization",

// Constructors
"constructor",

// Getters and Setters at the same rank
["get", "set"],

// Methods
"method",
]

使用しない場合

メンバーの一般的な順序を気にしない場合は、このルールは必要ありません。

リソース