object-property-newline
このルールは、オブジェクトリテラルのプロパティ指定の位置を制限することができます。プロパティ指定の一部が、他のプロパティ指定の一部と同じ行に表示されることを禁止できます。この禁止を絶対的に行うことも、オブジェクトオプションを呼び出すことで例外を設け、オブジェクトリテラルのすべてのプロパティ指定のすべてのパーツを1行に記述できるようにすることもできます。
ルールの詳細
動機
このルールにより、スタイルガイドで要求されるように、読みやすさを向上させるためにプロパティ指定を別々の行に表示させることができます。たとえば、以下のすべてを禁止できます。
const newObject = {a: 1, b: [2, {a: 3, b: 4}]};
const newObject = {
a: 1, b: [2, {a: 3, b: 4}]
};
const newObject = {
a: 1,
b: [2, {a: 3, b: 4}]
};
const newObject = {
a: 1,
b: [
2,
{a: 3, b: 4}
]
};
これらの代わりに、以下のように記述することでルールに準拠できます。
const newObject = {
a: 1,
b: [2, {
a: 3,
b: 4
}]
};
または
const newObject = {
a: 1,
b: [
2,
{
a: 3,
b: 4
}
]
};
このルールのもう1つの利点は、プロパティが変更されたときのdiffの特異性です。
// More specific
var obj = {
foo: "foo",
- bar: "bar",
+ bar: "bazz",
baz: "baz"
};
// Less specific
-var obj = { foo: "foo", bar: "bar", baz: "baz" };
+var obj = { foo: "foo", bar: "bazz", baz: "baz" };
オプションの例外
このルールは、1つのオブジェクトオプション`allowAllPropertiesOnSameLine`(非推奨の同義語は`allowMultiplePropertiesPerLine`)を提供します。これを`true`に設定すると、上記最初の2つのような、すべてのプロパティ指定が同じ行にあるオブジェクトリテラルは許可されますが、次のようなものは許可されません。
const newObject = {
a: 'a.m.', b: 'p.m.',
c: 'daylight saving time'
};
これは、2つのプロパティが同じ行に表示されますが、すべてのプロパティが同じ行に表示されるわけではないため、禁止されます。
表記法
このルールは、表記法に関係なく、以下のものを含むすべてのプロパティ指定に等しく適用されます。
- `a: 1` (ES5)
- `a` (ES2015省略記法プロパティ)
- ``prop${a}`` (ES2015算出プロパティ名)
したがって、このルール(オプションの例外なし)は、以下の両方を禁止します。
const newObject = {
a: 1, [
process.argv[4]
]: '01'
};
const newObject = {
a: 1, [process.argv[4]]: '01'
};
(この動作は、以下に示すJSCSルールの動作とは異なります。JSCSルールは、算出プロパティ名の先頭の`[`をそのプロパティ指定の一部として扱いません。JSCSルールは、これらの2番目の形式を禁止しますが、最初の形式は許可します。)
複数行のプロパティ
このルールは、1つのプロパティ指定の少なくとも1文字と、他のプロパティ指定の少なくとも1文字が同じ行に配置されることを禁止します。たとえば、このルールは以下を禁止します。
const newObject = {a: [
'Officiële website van de Europese Unie',
'Официален уебсайт на Европейския съюз'
], b: 2};
これは、`a`の指定の1文字(つまり、その値の末尾の`]`)が`b`の指定と同じ行にあるためです。
オプションの例外は、このケースを免除しません。これは、プロパティ指定のコレクション全体が1行ではなく4行にわたるためです。
プロパティ間の区切り文字
プロパティ指定を区切るカンマと空白は、それらの一部とは見なされません。したがって、このルールは、以下の両方の形式を許可します。
const newFunction = multiplier => ({
a: 2 * multiplier,
b: 4 * multiplier,
c: 8 * multiplier
});
const newFunction = multiplier => ({
a: 2 * multiplier
, b: 4 * multiplier
, c: 8 * multiplier
});
(この動作は、以下に示すJSCSルールの動作とは異なります。JSCSルールは、最初の形式を許可しますが、2番目の形式を禁止します。)
--fix
このルールがコマンドラインの`--fix`オプションで呼び出された場合、ルールに違反するオブジェクトリテラルは、一般にルールに準拠するように変更されます。それぞれの場合の変更は、同じ行に前のプロパティ指定の一部または全部がある場合は常に、プロパティ指定を次の行に移動することです。たとえば、
const newObject = {
a: 'a.m.', b: 'p.m.',
c: 'daylight saving time'
};
は以下に変換されます。
const newObject = {
a: 'a.m.',
b: 'p.m.',
c: 'daylight saving time'
};
変更は、オブジェクトオプションが`true`に設定されているかどうかに依存しません。言い換えれば、ESLintは、オブジェクトオプションで許可されている場合でも、すべてのプロパティ指定を1行にまとめることはありません。
ESLintは、コメントが2番目以降のプロパティ指定の直前にある場合、このルールの違反を修正しません。これは、ESLintがコメントをどの行に配置するかを判断できないためです。
上記のように、このルールに適用される`--fix`オプションは、`indent`などの他のルールには準拠していませんが、それらの他のルールも有効になっている場合は、オプションはそれらにも適用されます。
例
オブジェクトオプションがない場合、または`allowAllPropertiesOnSameLine`が`false`に設定されている場合の、このルールの**誤った**コードの例
/*eslint @stylistic/object-property-newline: "error"*/
const obj0 = { foo: "foo", bar: "bar", baz: "baz" };
const obj1 = {
foo: "foo", bar: "bar", baz: "baz"
};
const obj2 = {
foo: "foo", bar: "bar",
baz: "baz"
};
const obj3 = {
[process.argv[3] ? "foo" : "bar"]: 0, baz: [
1,
2,
4,
8
]
};
const a = "antidisestablishmentarianistically";
const b = "yugoslavyalılaştırabildiklerimizdenmişsiniz";
const obj4 = {a, b};
const domain = process.argv[4];
const obj5 = {
foo: "foo", [
domain.includes(":") ? "complexdomain" : "simpledomain"
]: true};
オブジェクトオプションがない場合、または`allowAllPropertiesOnSameLine`が`false`に設定されている場合の、このルールの**正しい**コードの例
/*eslint @stylistic/object-property-newline: "error"*/
const obj1 = {
foo: "foo",
bar: "bar",
baz: "baz"
};
const obj2 = {
foo: "foo"
, bar: "bar"
, baz: "baz"
};
const user = process.argv[2];
const obj3 = {
user,
[process.argv[3] ? "foo" : "bar"]: 0,
baz: [
1,
2,
4,
8
]
};
`{ "allowAllPropertiesOnSameLine": true }`オプションを使用した場合の、このルールの追加の**正しい**コードの例
/*eslint @stylistic/object-property-newline: ["error", { "allowAllPropertiesOnSameLine": true }]*/
const obj = { foo: "foo", bar: "bar", baz: "baz" };
const obj2 = {
foo: "foo", bar: "bar", baz: "baz"
};
const user = process.argv[2];
const obj3 = {
user, [process.argv[3] ? "foo" : "bar"]: 0, baz: [1, 2, 4, 8]
};
使用しない場合
プロパティ指定を別々の行に配置するかどうかをケースバイケースで決定する場合は、このルールを無効にすることができます。
互換性
- **JSCS**: このルールは、requireObjectKeysOnNewLineとの部分的な互換性を提供します。