diff --git a/packages/eslint-plugin/src/rules/space-infix-ops.ts b/packages/eslint-plugin/src/rules/space-infix-ops.ts index ff6e15ac3400..73d115ecfbfd 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 72f71d00358b..26e623231671 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 { pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy