Disallows unused imports, variables, functions, classes, type parameters and more. Similar to tsc
’s --noUnusedParameters
and --noUnusedLocals
options and the tslint
core rule no-unused-variable
.
Use no-unused-expression
in addition to this rule to uncover even more dead code.
- Errors can be disabled and don't fail compilation.
- Works without the type checker and therefore without
--project
option. - Works for .js files.
- No false positives with parameters of abstract methods.
- No false positives with destructuring. See tslint#2876
- No side effects on typescript's type system. See tslint#2736 tslint#2649 tslint#2571
- Only fixes unused names of function and class expressions.
- Cannot check if an import is implicitly used by the declaration emitter, but you can disable errors on imports in .ts files with
"ignore-imports"
- Can optionally complain about named function and class expressions that are never used by name with options
"unused-function-expression-name"
and"unused-class-expression-name"
- Can optionally complain about unused catch bindings (supported since typescript@2.5.1) with option
"unused-catch-binding"
- Does not check private class members.
- Does not check for unused labels.
- Needs to be more liberal with variables in global scope, e.g. top level variable declarations if the file has no imports or exports.
- Flags write only variables as error. (Also supported by typescript@2.6.0)
- Flags functions and classes that are only used inside of their declaration as error.
- Handles declarations in different domains separately:
interface T {}
// ~ [Interface 'T' is unused.]
class T {}
export = new T();
interface U {}
namespace U {}
// ~ [Namespace 'U' is unused.]
export let v: U;
There are cases where you simply need to have a parameter or variable, but don't use it. You can prefix the name with an underscore _
to ignore it.
The underscore works in the following cases:
- Parameters
- Object destructuring that contains rest
for ... in
andfor ... of
loops
/* 1 */
function doStuff(_a, _b, c) {
return c;
}
/* 2 */
let {a: _a, ...bAndC} = {a: 1, b: 2, c: 3};
/* 3 */
for (const _ in someObj)
++keyCount;
for (const _ of someArr)
++valueCount;
When using --declaration
in your tsconfig.json
, the declaration emitter may implicitly use otherwise unused imports (See TypeScript#9944). You can either disable the error on those imports or use the "ignore-imports"
option to ignore imports in all .ts files completely.
Disable errors on unused parameters. This does not include destructured parameters.
Enables checking for named function expressions that are never used by name.
These names may serve a purpose in your code, e.g. for easier debugging. Therefore this option is not enabled by default.
Not Passing:
setTimeout(function foo() { }, 100);
// ~~~ [Function 'foo' is never used by its name. Convert it to an anonymous function expression.]
Passing:
setTimeout(function() { }, 100);
let result = (function fac(i) {
return i === 1 ? 1 : i * fac(i - 1);
})(5);
Basically the same as "unused-function-expression-name"
but for class expressions.
As of TypeScript@2.5.1 you can omit the catch binding if you're not going to use it. This option helps you identify such cases.
Not Passing:
try {
JSON.parse(foo);
} catch (e) {
// ~ [Variable 'e' is unused.]
console.log('invalid json');
}
Passing:
try {
JSON.parse(foo);
} catch {
console.log('invalid json');
}