Skip to main content

no-unnecessary-type-assertion

Disallow type assertions that do not change the type of an expression.

🔧

Some problems reported by this rule are automatically fixable by the --fix ESLint command line option.

💭

This rule requires type information to run.

TypeScript can be told an expression is a different type than expected using as type assertions. Leaving as assertions in the codebase increases visual clutter and harms code readability, so it's generally best practice to remove them if they don't change the type of an expression. This rule reports when a type assertion does not change the type of an expression.

eslint.config.mjs
export default tseslint.config({
rules: {
"@typescript-eslint/no-unnecessary-type-assertion": "error"
}
});

Try this rule in the playground ↗

Examples

const foo = 3;
const bar = foo!;
Open in Playground
const foo = <number>(3 + 5);
Open in Playground
type Foo = number;
const foo = <Foo>(3 + 5);
Open in Playground
type Foo = number;
const foo = (3 + 5) as Foo;
Open in Playground
const foo = 'foo' as const;
Open in Playground
function foo(x: number): number {
return x!; // unnecessary non-null
}
Open in Playground

Options

This rule accepts the following options:

type Options = [
{
/** A list of type names to ignore. */
typesToIgnore?: string[];
},
];

const defaultOptions: Options = [{}];

typesToIgnore

A list of type names to ignore. Default: [].

With @typescript-eslint/no-unnecessary-type-assertion: ["error", { typesToIgnore: ['Foo'] }], the following is correct code:

type Foo = 3;
const foo: Foo = 3;
Open in Playground

When Not To Use It

If you don't care about having no-op type assertions in your code, then you can turn off this rule.


Type checked lint rules are more powerful than traditional lint rules, but also require configuring type checked linting.

See Troubleshooting > Linting with Type Information > Performance if you experience performance degradations after enabling type checked rules.

Resources