为什么不将“ any”分配给任何类型而无需先显式转换?

时间:2019-01-08 12:40:30

标签: typescript types casting any explicit

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

{
    let x: number;
    let y: any;

    y = "hello";
    x = y;
}

我的期望是:应该将y的任何内容都明确地键入为any,但是应该将数字分配给x,因为它的明确类型是{{1 }},如果需要将number分配给any,则应将其显式转换为x

number

当前的行为如何被认为是可以接受的,或者是一个好主意,而不是最初的错误?此外,是否有一种方法可以迫使编译器对此提出问题,并且仅接受显式强制转换?


  

其他信息:

     
      
  • x = y as number; 版本:tsc
  •   
  • 编译器选项:
  •   
{
    "target": "ES5",
    "noImplicitAny": true,
    "strictNullChecks": true,
    "downlevelIteration": true,
    "experimentalDecorators": true,
    "strictBindCallApply": true,
    "strictFunctionTypes": true,
    "strictPropertyInitialization": true
}

1 个答案:

答案 0 :(得分:2)

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

  • 可从其他任何类型分配
  • 分配给任何其他类型(您突出显示的问题)
  • 允许执行任何操作(索引,调用,属性访问,操作员应用程序,所有操作均被允许且不以任何方式检查)

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

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

所有这些,我今天将不惜一切代价避免any在Typescript中使用。打字稿3.0引入了unknown类型,其行为类似于您期望any的行为(即,您可以为其分配任何内容,但不能分配给任何其他类型)。进一步了解unknown here

摆脱any的一些选择:

  • noImplictAny编译器设置可防止编译器在未指定类型的情况下推断any(相反,它将发出错误)
  • no-unsafe-any tslint规则,以动态方式禁止使用any,即,只有在no-any适用的情况下才允许使用|空|未定义
  • any tslint规则,禁止{{1}}
  • 的任何使用