# 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
}
]
};
此规则的另一个好处是更改属性时差异的特异性:
// 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: "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 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
的部分兼容性。