diff --git a/packages/eslint-plugin/src/rules/space-infix-ops.ts b/packages/eslint-plugin/src/rules/space-infix-ops.ts index ff6e15ac340..73d115ecfbf 100644 --- a/packages/eslint-plugin/src/rules/space-infix-ops.ts +++ b/packages/eslint-plugin/src/rules/space-infix-ops.ts @@ -69,7 +69,10 @@ export default util.createRule({ }; function isSpaceChar(token: TSESTree.Token): boolean { - return token.type === AST_TOKEN_TYPES.Punctuator && token.value === '='; + return ( + token.type === AST_TOKEN_TYPES.Punctuator && + /^[=|?|:]$/.test(token.value) + ); } function checkAndReportAssignmentSpace( @@ -180,6 +183,21 @@ export default util.createRule({ checkAndReportAssignmentSpace(node, leftNode, rightNode); } + function checkForTypeConditional(node: TSESTree.TSConditionalType): void { + const extendsTypeNode = sourceCode.getTokenByRangeStart( + node.extendsType.range[0], + )!; + const trueTypeNode = sourceCode.getTokenByRangeStart( + node.trueType.range[0], + )!; + const falseTypeNode = sourceCode.getTokenByRangeStart( + node.falseType.range[0], + ); + + checkAndReportAssignmentSpace(node, extendsTypeNode, trueTypeNode); + checkAndReportAssignmentSpace(node, trueTypeNode, falseTypeNode); + } + return { ...rules, TSEnumMember: checkForEnumAssignmentSpace, @@ -187,6 +205,7 @@ export default util.createRule({ TSTypeAliasDeclaration: checkForTypeAliasAssignment, TSUnionType: checkForTypeAnnotationSpace, TSIntersectionType: checkForTypeAnnotationSpace, + TSConditionalType: checkForTypeConditional, }; }, }); diff --git a/packages/eslint-plugin/tests/rules/space-infix-ops.test.ts b/packages/eslint-plugin/tests/rules/space-infix-ops.test.ts index 72f71d00358..26e62323167 100644 --- a/packages/eslint-plugin/tests/rules/space-infix-ops.test.ts +++ b/packages/eslint-plugin/tests/rules/space-infix-ops.test.ts @@ -977,6 +977,116 @@ ruleTester.run('space-infix-ops', rule, { }, ], }, + { + code: ` + type Test = T extends boolean?true:false + `, + output: ` + type Test = T extends boolean ? true : false + `, + errors: [ + { + messageId: 'missingSpace', + column: 41, + line: 2, + }, + { + messageId: 'missingSpace', + column: 46, + line: 2, + }, + ], + }, + { + code: ` + type Test = T extends boolean? true :false + `, + output: ` + type Test = T extends boolean ? true : false + `, + errors: [ + { + messageId: 'missingSpace', + column: 41, + line: 2, + }, + { + messageId: 'missingSpace', + column: 48, + line: 2, + }, + ], + }, + { + code: ` + type Test = T extends boolean? + true :false + `, + output: ` + type Test = T extends boolean ? + true : false + `, + errors: [ + { + messageId: 'missingSpace', + column: 41, + line: 2, + }, + { + messageId: 'missingSpace', + column: 16, + line: 3, + }, + ], + }, + { + code: ` + type Test = T extends boolean? + true + :false + `, + output: ` + type Test = T extends boolean ? + true + : false + `, + errors: [ + { + messageId: 'missingSpace', + column: 41, + line: 2, + }, + { + messageId: 'missingSpace', + column: 11, + line: 4, + }, + ], + }, + { + code: ` + type Test = T extends boolean + ?true: + false + `, + output: ` + type Test = T extends boolean + ? true : + false + `, + errors: [ + { + messageId: 'missingSpace', + column: 11, + line: 3, + }, + { + messageId: 'missingSpace', + column: 16, + line: 3, + }, + ], + }, { code: ` interface Test {