为什么可以将 'any' 分配给任何类型而不先显式转换它?

Why can 'any' be assigned to any type without explicitly casting it first?

为什么以下代码片段没有引发任何错误或警告?

{
    let x: number;
    let y: any;

    y = "hello";
    x = y;
}

我的期望是:任何东西都应该分配给 y,因为它被明确键入为 any,但是只有数字应该被分配给 x,因为它被明确键入为 number 并且如果需要将 any 分配给 x 则应将其显式转换为 number:

x = y as number; 

当前的行为如何被认为是可以接受的或一个好主意,而不是首先是错误?此外,有没有办法强制编译器对此提出问题并只接受显式转换?


Extra Info:

  • tsc version: 3.2.2
  • compiler options:
{
    "target": "ES5",
    "noImplicitAny": true,
    "strictNullChecks": true,
    "downlevelIteration": true,
    "experimentalDecorators": true,
    "strictBindCallApply": true,
    "strictFunctionTypes": true,
    "strictPropertyInitialization": true
}

这是 any 的定义行为。此类型为同一类型:

  • 可从任何其他类型分配
  • 可分配任何其他类型(您突出显示的问题)
  • 允许使用它进行任何操作(索引、调用、属性 访问、操作员应用程序,所有这些都允许并且不以任何方式检查)

any 有多种用途。几个例子:

  • 允许从 js 轻松过渡到 ts。当您将代码转换为打字稿时,any 非常有用,可以让您在转换过程中成功编译代码。
  • 允许与现有的 JS 代码轻松互操作(只需键入 any,您就可以像在 JS 中一样使用它)。虽然您可能最好在长 运行 中编写定义。

综上所述,我今天会不惜一切代价避免使用 Typescript。 Typescript 3.0 引入了 unknown 类型,它的行为与您期望 any 的行为一样(即,您可以为其分配任何内容,但不能将其分配给任何其他类型)。阅读更多关于 unknown

摆脱自己的几个选择any

  • noImplictAny 编译器设置阻止编译器推断 any 如果你没有指定类型(它会发出错误)
  • no-unsafe-any tslint 规则,防止以动态方式使用 any,即只有在适用于 {} | 时才允许使用空 |未定义
  • no-any tslint 规则,防止 any
  • 的所有使用