禁止在 Typescript 中将任何类型的变量分配给其他类型的变量

Forbid assigning a variable of type any to a variable of other type in Typescript

所以我有这段代码

let var1: any;
var1 = 'hello';
let var2: number = var1;

出于某种原因,typescript 没有抱怨我正在尝试将 any 类型的变量分配给 number。有人知道是否有禁止这样做的编译器或 tslint 规则吗?是的,我现在可以禁止 any,但即使禁止,错误也会发生在 line 1,而不是 line 3.

Typescript playground example


为我原来的问题添加更多细节

我的具体情况是使用具有类似

定义的第三方库
// Definition file
export declare class StateParams {
    [key: string]: any;
}

... later on in my own code

function myFunc(theVar: StateParams) {
    // I know myParam is a number, but all typescript knows is that myParam is of type any
    let otherVar: number = theVar.myParam;
}

所以,即使我有 tsLint no-any 规则,这也无济于事,打字稿也不会抱怨,我对 StateParams 无能为力,因为我做不到控制它

基于“3.11.4 赋值兼容性”部分下的 TypeScript 语言规范 (https://github.com/Microsoft/TypeScript/blob/master/doc/spec.md#3.11.4):

S is assignable to a type T, and T is assignable from S, if S has no excess properties with respect to T (3.11.5) and one of the following is true:

  • S and T are identical types.
  • S or T is the Any type.

这表示任何类型都可以分配给“any”,“any”也可以分配给任何其他类型。

最佳做法是永远不要在代码中使用类型“any”,除非您将现有的 JS 代码库移至 TS。在这种情况下,您可以从所有类型的“任何”开始,然后随着时间的推移将它们更改为更具体的类型。

如果您的变量具有无法使用简单 TS 类型捕获的复杂类型,您可以手动定义更具体的类型或使用联合来允许多种类型。例如:

let var1: number | string;
var1 = 'hello';
let var2: number = var1;

现在,上面的代码将正确地抛出一个错误,即您无法将 var1 类型的可能字符串分配给 var2

你可以在任何地方使用 @typescript-eslint/no-explicit-any eslint rule to enforce unknown 类型而不是 any:

.eslintrc.json

{
...
  "parser": "@typescript-eslint/parser",
  "plugins": ["@typescript-eslint"],
  "rules": {
    "@typescript-eslint/no-explicit-any": ["error", {
      "fixToUnknown": true
    }],