Skip to content

Commit 0bfab6c

Browse files
authored
feat(eslint-plugin): [space-infix-ops] missing error report for conditional types (typescript-eslint#5041)
1 parent eaa5d7b commit 0bfab6c

File tree

2 files changed

+130
-1
lines changed

2 files changed

+130
-1
lines changed

packages/eslint-plugin/src/rules/space-infix-ops.ts

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,10 @@ export default util.createRule<Options, MessageIds>({
6969
};
7070

7171
function isSpaceChar(token: TSESTree.Token): boolean {
72-
return token.type === AST_TOKEN_TYPES.Punctuator && token.value === '=';
72+
return (
73+
token.type === AST_TOKEN_TYPES.Punctuator &&
74+
/^[=|?|:]$/.test(token.value)
75+
);
7376
}
7477

7578
function checkAndReportAssignmentSpace(
@@ -180,13 +183,29 @@ export default util.createRule<Options, MessageIds>({
180183
checkAndReportAssignmentSpace(node, leftNode, rightNode);
181184
}
182185

186+
function checkForTypeConditional(node: TSESTree.TSConditionalType): void {
187+
const extendsTypeNode = sourceCode.getTokenByRangeStart(
188+
node.extendsType.range[0],
189+
)!;
190+
const trueTypeNode = sourceCode.getTokenByRangeStart(
191+
node.trueType.range[0],
192+
)!;
193+
const falseTypeNode = sourceCode.getTokenByRangeStart(
194+
node.falseType.range[0],
195+
);
196+
197+
checkAndReportAssignmentSpace(node, extendsTypeNode, trueTypeNode);
198+
checkAndReportAssignmentSpace(node, trueTypeNode, falseTypeNode);
199+
}
200+
183201
return {
184202
...rules,
185203
TSEnumMember: checkForEnumAssignmentSpace,
186204
PropertyDefinition: checkForPropertyDefinitionAssignmentSpace,
187205
TSTypeAliasDeclaration: checkForTypeAliasAssignment,
188206
TSUnionType: checkForTypeAnnotationSpace,
189207
TSIntersectionType: checkForTypeAnnotationSpace,
208+
TSConditionalType: checkForTypeConditional,
190209
};
191210
},
192211
});

packages/eslint-plugin/tests/rules/space-infix-ops.test.ts

Lines changed: 110 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -977,6 +977,116 @@ ruleTester.run('space-infix-ops', rule, {
977977
},
978978
],
979979
},
980+
{
981+
code: `
982+
type Test<T> = T extends boolean?true:false
983+
`,
984+
output: `
985+
type Test<T> = T extends boolean ? true : false
986+
`,
987+
errors: [
988+
{
989+
messageId: 'missingSpace',
990+
column: 41,
991+
line: 2,
992+
},
993+
{
994+
messageId: 'missingSpace',
995+
column: 46,
996+
line: 2,
997+
},
998+
],
999+
},
1000+
{
1001+
code: `
1002+
type Test<T> = T extends boolean? true :false
1003+
`,
1004+
output: `
1005+
type Test<T> = T extends boolean ? true : false
1006+
`,
1007+
errors: [
1008+
{
1009+
messageId: 'missingSpace',
1010+
column: 41,
1011+
line: 2,
1012+
},
1013+
{
1014+
messageId: 'missingSpace',
1015+
column: 48,
1016+
line: 2,
1017+
},
1018+
],
1019+
},
1020+
{
1021+
code: `
1022+
type Test<T> = T extends boolean?
1023+
true :false
1024+
`,
1025+
output: `
1026+
type Test<T> = T extends boolean ?
1027+
true : false
1028+
`,
1029+
errors: [
1030+
{
1031+
messageId: 'missingSpace',
1032+
column: 41,
1033+
line: 2,
1034+
},
1035+
{
1036+
messageId: 'missingSpace',
1037+
column: 16,
1038+
line: 3,
1039+
},
1040+
],
1041+
},
1042+
{
1043+
code: `
1044+
type Test<T> = T extends boolean?
1045+
true
1046+
:false
1047+
`,
1048+
output: `
1049+
type Test<T> = T extends boolean ?
1050+
true
1051+
: false
1052+
`,
1053+
errors: [
1054+
{
1055+
messageId: 'missingSpace',
1056+
column: 41,
1057+
line: 2,
1058+
},
1059+
{
1060+
messageId: 'missingSpace',
1061+
column: 11,
1062+
line: 4,
1063+
},
1064+
],
1065+
},
1066+
{
1067+
code: `
1068+
type Test<T> = T extends boolean
1069+
?true:
1070+
false
1071+
`,
1072+
output: `
1073+
type Test<T> = T extends boolean
1074+
? true :
1075+
false
1076+
`,
1077+
errors: [
1078+
{
1079+
messageId: 'missingSpace',
1080+
column: 11,
1081+
line: 3,
1082+
},
1083+
{
1084+
messageId: 'missingSpace',
1085+
column: 16,
1086+
line: 3,
1087+
},
1088+
],
1089+
},
9801090
{
9811091
code: `
9821092
interface Test {

0 commit comments

Comments
 (0)