diff --git a/packages/eslint-plugin/docs/rules/no-object-literal-type-assertion.md b/packages/eslint-plugin/docs/rules/no-object-literal-type-assertion.md index fe25f8f64107..b81ae0d87b69 100644 --- a/packages/eslint-plugin/docs/rules/no-object-literal-type-assertion.md +++ b/packages/eslint-plugin/docs/rules/no-object-literal-type-assertion.md @@ -20,9 +20,11 @@ const z = { ... } as unknown; ## Options -```json +```cjson { - "@typescript-eslint/no-object-literal-type-assertion": "error" + "@typescript-eslint/no-object-literal-type-assertion": ["error", { + allowAsParameter: false // Allow type assertion in call and new expression, default false + }] } ``` diff --git a/packages/eslint-plugin/lib/rules/no-object-literal-type-assertion.js b/packages/eslint-plugin/lib/rules/no-object-literal-type-assertion.js index f98a28a38f0c..11258a99315f 100644 --- a/packages/eslint-plugin/lib/rules/no-object-literal-type-assertion.js +++ b/packages/eslint-plugin/lib/rules/no-object-literal-type-assertion.js @@ -10,6 +10,12 @@ const util = require('../util'); // Rule Definition //------------------------------------------------------------------------------ +const defaultOptions = [ + { + allowAsParameter: false + } +]; + module.exports = { meta: { type: 'problem', @@ -25,9 +31,24 @@ module.exports = { unexpectedTypeAssertion: 'Type assertion on object literals is forbidden, use a type annotation instead.' }, - schema: [] + schema: [ + { + type: 'object', + additionalProperties: false, + properties: { + allowAsParameter: { + type: 'boolean' + } + } + } + ] }, create(context) { + const { allowAsParameter } = util.applyDefault( + defaultOptions, + context.options + )[0]; + //---------------------------------------------------------------------- // Public //---------------------------------------------------------------------- @@ -52,6 +73,14 @@ module.exports = { return { 'TSTypeAssertion, TSAsExpression'(node) { + if ( + allowAsParameter && + (node.parent.type === 'NewExpression' || + node.parent.type === 'CallExpression') + ) { + return; + } + if ( checkType(node.typeAnnotation) && node.expression.type === 'ObjectExpression' diff --git a/packages/eslint-plugin/tests/lib/rules/no-object-literal-type-assertion.js b/packages/eslint-plugin/tests/lib/rules/no-object-literal-type-assertion.js index 2a037390e0b5..aa19b09e8601 100644 --- a/packages/eslint-plugin/tests/lib/rules/no-object-literal-type-assertion.js +++ b/packages/eslint-plugin/tests/lib/rules/no-object-literal-type-assertion.js @@ -39,7 +39,23 @@ ruleTester.run('no-object-literal-type-assertion', rule, { `const foo = {};`, // Allow cast to 'unknown' `const foo = {} as unknown;`, - `const foo = {};` + `const foo = {};`, + { + code: `print({ bar: 5 } as Foo)`, + options: [ + { + allowAsParameter: true + } + ] + }, + { + code: `new print({ bar: 5 } as Foo)`, + options: [ + { + allowAsParameter: true + } + ] + } ], invalid: [ { @@ -71,6 +87,26 @@ ruleTester.run('no-object-literal-type-assertion', rule, { column: 11 } ] + }, + { + code: `print({ bar: 5 } as Foo)`, + errors: [ + { + messageId: 'unexpectedTypeAssertion', + line: 1, + column: 7 + } + ] + }, + { + code: `new print({ bar: 5 } as Foo)`, + errors: [ + { + messageId: 'unexpectedTypeAssertion', + line: 1, + column: 11 + } + ] } ] });