Skip to content

noEvolvingTypes

Diagnostic Category: lint/suspicious/noEvolvingTypes

Since: v1.6.3 Disallow variables from evolving into any type through reassignments.

In TypeScript, variables without explicit type annotations can evolve their types based on subsequent assignments.

When TypeScript’s noImplicitAny is disabled, variables without explicit type annotations have implicitly the type any. Just like the any type, evolved any types disable many type-checking rules and should be avoided to maintain strong type safety. This rule prevents such cases by ensuring variables do not evolve into any type, encouraging explicit type annotations and controlled type evolutions.

If you enabled TypeScript’s noImplicitAny and want to benefit of evolving types, then we recommend to disable this rule.

let a;
code-block.ts:1:5 lint/suspicious/noEvolvingTypes ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

The type of this variable may evolve implicitly to any type, including the any type.

> 1 │ let a;
^
2 │

Add an explicit type or initialization to avoid implicit type evolution.

const b = [];
code-block.ts:1:7 lint/suspicious/noEvolvingTypes ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

The type of this variable may evolve implicitly to any type, including the any type.

> 1 │ const b = [];
^
2 │

Add an explicit type or initialization to avoid implicit type evolution.

let c = null;
code-block.ts:1:5 lint/suspicious/noEvolvingTypes ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

The type of this variable may evolve implicitly to any type, including the any type.

> 1 │ let c = null;
^
2 │

Add an explicit type or initialization to avoid implicit type evolution.

let a: number;
let b = 1;
var c : string;
var d = "abn";
const e: never[] = [];
const f = [null];
const g = ['1'];
const h = [1];
let workspace: Workspace | null = null;