no-unused-expressions
Disallow unused expressions.
✅
Extending "plugin:@typescript-eslint/recommended" in an ESLint configuration enables this rule.
This rule extends the base eslint/no-unused-expressions rule.
It supports TypeScript-specific expressions:
- Marks directives in modules declarations ("use strict", etc.) as not unused
- Marks the following expressions as unused if their wrapped value expressions are unused:
- Assertion expressions: x as number;,x!;,<number>x;
- Instantiation expressions: Set<number>;
 
- Assertion expressions: 
Although the type expressions never have runtime side effects (that is, x!; is the same as x;), they can be used to assert types for testing purposes.
Examples
- ❌ Incorrect
- ✅ Correct
Set<number>;
1 as number;
window!;
function getSet() {
  return Set;
}
// Funtion calls are allowed, so type expressions that wrap function calls are allowed
getSet()<number>;
getSet() as Set<unknown>;
getSet()!;
// Namespaces can have directives
namespace A {
  'use strict';
}
Options
See eslint/no-unused-expressions's options.
How to Use
- Flat Config
- Legacy Config
eslint.config.mjs
export default tseslint.config({
  rules: {
    // Note: you must disable the base rule as it can report incorrect errors
    "no-unused-expressions": "off",
    "@typescript-eslint/no-unused-expressions": "error"
  }
});
.eslintrc.cjs
module.exports = {
  "rules": {
    // Note: you must disable the base rule as it can report incorrect errors
    "no-unused-expressions": "off",
    "@typescript-eslint/no-unused-expressions": "error"
  }
};
Try this rule in the playground ↗