object-property-newline
强制对象属性放在不同的行上
此规则报告的一些问题可以通过 --fix
命令行 选项自动修复
此规则允许您限制对象字面量中属性规范的位置。您可以禁止任何属性规范的任何部分与任何其他属性规范的任何部分出现在同一行上。您可以使此禁令绝对,或者,通过调用对象选项,您可以允许例外,允许对象字面量将其所有属性规范的所有部分放在同一行上。
规则详情
动机
此规则使得可以确保,正如一些风格指南所要求的那样,属性规范出现在不同的行上以获得更好的可读性。例如,您可以禁止所有这些
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
}
]
};
此规则的另一个好处是,当属性更改时,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" };
可选例外
该规则提供一个对象选项,allowAllPropertiesOnSameLine
(一个已弃用的同义词是 allowMultiplePropertiesPerLine
)。如果您将其设置为 true
,则允许使用对象字面量,例如上面前两个,其中所有属性规范都在同一行上,但像这样的则不允许
const newObject = {
a: 'a.m.', b: 'p.m.',
c: 'daylight saving time'
};
将被禁止,因为两个属性(但不是所有属性)出现在同一行上。
标记法
此规则同样适用于所有属性规范,无论标记法如何,包括
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 规则禁止第二种格式,但允许第一种格式。)
多行属性
该规则禁止在一个属性规范的至少 1 个字符与任何其他属性规范的至少 1 个字符在任何行上共存。例如,该规则禁止
const newObject = {a: [
'Officiële website van de Europese Unie',
'Официален уебсайт на Европейския съюз'
], b: 2};
因为 a
规范的 1 个字符(即其值的尾随 ]
)与 b
的规范在同一行上。
可选例外不适用于这种情况,因为整个属性规范集合跨越 4 行,而不是 1 行。
属性间分隔符
逗号和任何分隔属性规范的空格不被视为属性规范的一部分。因此,该规则允许以下两种格式
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 规则的行为不同,后者允许第一种格式,但禁止第二种格式。)
–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 也永远不会将所有属性规范收集到单行上。
如果注释紧跟在行上的第二个或后续属性规范之前,则 ESLint 不会纠正对此规则的违反,因为 ESLint 无法确定将注释放在哪一行上。
如上所示,应用于此规则的 --fix
选项不符合其他规则(例如 indent
),但是,如果这些其他规则也生效,则该选项也会应用它们。
示例
此规则的不正确代码示例,没有对象选项或 allowAllPropertiesOnSameLine
设置为 false
/*eslint object-property-newline: "error"*/
const obj0 = { foo: "foo", : "bar", : "baz" };
const obj1 = {
foo: "foo", : "bar", : "baz"
};
const obj2 = {
foo: "foo", : "bar",
baz: "baz"
};
const obj3 = {
[process.argv[3] ? "foo" : "bar"]: 0, : [
1,
2,
4,
8
]
};
const a = "antidisestablishmentarianistically";
const b = "yugoslavyalılaştırabildiklerimizdenmişsiniz";
const obj4 = {a, };
const domain = process.argv[4];
const obj5 = {
foo: "foo",
domain.includes(":") ? "complexdomain" : "simpledomain"
]: true};
此规则的正确代码示例,没有对象选项或 allowAllPropertiesOnSameLine
设置为 false
/*eslint 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 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 的部分兼容性。
相关规则
版本
此规则在 ESLint v2.10.0 中引入。