代码之家  ›  专栏  ›  技术社区  ›  Peter Varo

为什么不首先显式地将“any”赋给任何类型?

  •  1
  • Peter Varo  · 技术社区  · 6 年前

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

    {
        let x: number;
        let y: any;
    
        y = "hello";
        x = y;
    }
    

    我的期望是:任何事情都应该分配给 y 因为它显式键入为 any ,但只应将数字分配给 x 因为它显式键入为 number 如果是 任何 需要分配给 X 那么应该显式地强制转换为 :

    x = y as number; 
    

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


    额外信息:

    • tsc 版本: 3.2.2
    • 编译器选项:
    {
        "target": "ES5",
        "noImplicitAny": true,
        "strictNullChecks": true,
        "downlevelIteration": true,
        "experimentalDecorators": true,
        "strictBindCallApply": true,
        "strictFunctionTypes": true,
        "strictPropertyInitialization": true
    }
    
    1 回复  |  直到 6 年前
        1
  •  2
  •   Titian Cernicova-Dragomir    6 年前

    这是 any . 此类型与以下类型相同:

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

    有几种用途 任何 . 几个例子:

    • 允许从JS到TS的轻松转换。在将代码转换为typescript时 任何 当您还在转换时,允许您成功地编译代码是非常有用的。
    • 允许轻松地与现有的JS代码进行互操作(只需键入 任何 您可以像在JS中那样使用它)。尽管从长远来看,最好还是写下定义。

    所有这些话,我都会避免 任何 在今天的打字中不惜一切代价。打字稿 3.0 介绍 unknown 行为与预期一致的类型 任何 行为(也就是说,你可以给它分配任何东西,但它不能分配给任何其他类型)。阅读更多有关 未知的 here

    摆脱自己的几个选择 任何 :

    • noImplictAny 编译器设置阻止编译器推断 任何 如果不指定类型(它将发出错误)
    • no-unsafe-any tslint规则,防止使用 任何 在动态方式下,仅当ie的用法适用于空未定义时,才允许使用ie。
    • no-any tslint规则,防止 任何
    推荐文章