diff --git a/src/rules/noAngleBracketTypeAssertionRule.ts b/src/rules/noAngleBracketTypeAssertionRule.ts index 093ead1a124..0b67f4b744d 100644 --- a/src/rules/noAngleBracketTypeAssertionRule.ts +++ b/src/rules/noAngleBracketTypeAssertionRule.ts @@ -51,7 +51,7 @@ function walk(ctx: Lint.WalkContext) { if (isTypeAssertion(node)) { let { expression } = node; const start = node.getStart(ctx.sourceFile); - const addParens = needsParens(node); + const addParens = isBinaryExpression(node.parent); let replaceText = ` as ${node.type.getText(ctx.sourceFile)}${addParens ? ")" : ""}`; while (isTypeAssertion(expression)) { replaceText = ` as ${expression.type.getText(ctx.sourceFile)}${replaceText}`; @@ -70,12 +70,3 @@ function walk(ctx: Lint.WalkContext) { return ts.forEachChild(node, cb); }); } - -function needsParens(node: ts.TypeAssertion): boolean { - const parent = node.parent; - return ( - isBinaryExpression(parent) && - (parent.operatorToken.kind === ts.SyntaxKind.AmpersandToken || - parent.operatorToken.kind === ts.SyntaxKind.BarToken) - ); -} diff --git a/test/rules/no-angle-bracket-type-assertion/test.ts.fix b/test/rules/no-angle-bracket-type-assertion/test.ts.fix index 08f751af1b6..292b90da4fa 100644 --- a/test/rules/no-angle-bracket-type-assertion/test.ts.fix +++ b/test/rules/no-angle-bracket-type-assertion/test.ts.fix @@ -15,3 +15,38 @@ let g = a as any as A; let h = a as any as AsyncIterableIterator; +interface Action { + payload: number | false; +} + +const action: Action = { + payload: 5, +} + +const booleanAction: Action = { + payload: false, +} + +const a = 5 + (action.payload as number); + +const a = 5 - (action.payload as number); + +const a = 5 * (action.payload as number); + +const a = 5 / (action.payload as number); + +const a = 5 % (action.payload as number); + +const a = 5 && (action.payload as number); + +const a = 5 || (action.payload as number); + +const a = 5 % (action.payload as any as number); + +const a = 5 && (action.payload as any as number); + +const a = 5 || (action.payload as any as number); + +const a = true || (booleanAction.payload as boolean); + +const a = false && (booleanAction.payload as boolean); diff --git a/test/rules/no-angle-bracket-type-assertion/test.ts.lint b/test/rules/no-angle-bracket-type-assertion/test.ts.lint index 12dbdeb54ef..b45672e67e5 100644 --- a/test/rules/no-angle-bracket-type-assertion/test.ts.lint +++ b/test/rules/no-angle-bracket-type-assertion/test.ts.lint @@ -23,4 +23,51 @@ let g = a; let h = a; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ [0] +interface Action { + payload: number | false; +} + +const action: Action = { + payload: 5, +} + +const booleanAction: Action = { + payload: false, +} + +const a = 5 + action.payload; + ~~~~~~~~~~~~~~~~~~~~~~ [0] + +const a = 5 - action.payload; + ~~~~~~~~~~~~~~~~~~~~~~ [0] + +const a = 5 * action.payload; + ~~~~~~~~~~~~~~~~~~~~~~ [0] + +const a = 5 / action.payload; + ~~~~~~~~~~~~~~~~~~~~~~ [0] + +const a = 5 % action.payload; + ~~~~~~~~~~~~~~~~~~~~~~ [0] + +const a = 5 && action.payload; + ~~~~~~~~~~~~~~~~~~~~~~ [0] + +const a = 5 || action.payload; + ~~~~~~~~~~~~~~~~~~~~~~ [0] + +const a = 5 % action.payload; + ~~~~~~~~~~~~~~~~~~~~~~~~~~~ [0] + +const a = 5 && action.payload; + ~~~~~~~~~~~~~~~~~~~~~~~~~~~ [0] + +const a = 5 || action.payload; + ~~~~~~~~~~~~~~~~~~~~~~~~~~~ [0] + +const a = true || booleanAction.payload; + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ [0] + +const a = false && booleanAction.payload; + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ [0] [0]: Type assertion using the '<>' syntax is forbidden. Use the 'as' syntax instead.