If you haven't yet, try enabling the TypeScript --noImplicitAny
compiler flag to stop declarations from accidentally forgetting to mark types of things that can't be inferred. This'll stop code such as function takesData(data) { /* ... */ }
from allowing their data
variables to "implicitly" be type any
.
Edit January 2023: the correct answer is now to use typescript-eslint:
Additionally, there are several ESLint rules from typescript-eslint you can use for any
s that can sneak in even with --noImplicitAny
:
You can enable those rules individually in your ESLint config to use them in your project. Alternately, they're all enabled if you extend from the plugin:@typescript-eslint/strict
configuration.
Finally, as Titian mentions in the comments, consider using unknown
in your code in any place you'd have wanted to use any
. unknown
is similar to any
but TypeScript will enforce that you properly type narrow unknown
values before using them unsafely.
The answer below is outdated because TSLint is deprecated. Please see above for the answer with typescript-eslint.
Additionally, there are a couple TSLint rules that help here:
no-any
: Disallows usages of any
as a type declaration. Use this to stop declarations from including any
in them, e.g. let data: any = {/*...*/}
.
no-unsafe-any
: Disallows accidentally using any
in an unsafe way. This is different from no-any
in that you might still be using any
types without knowing it: for example, let data = JSON.parse("{}");
.