代码之家  ›  专栏  ›  技术社区  ›  Suhail Gupta

转换为接口类型与简单声明类型之间的区别

  •  1
  • Suhail Gupta  · 技术社区  · 6 年前

    我在读关于 interfaces 在打字脚本中遇到了以下问题。

    名为 Square 定义如下:

    interface Square {
         width: number
    }
    

    然后是一个名为 square 通过将对象识字输入 正方形 类型:

    let square = <Square>{}
    

    我试过印刷 广场 typeof square 正如预期的那样 {} object . 但我无法区分上面的内容 广场 定义如下:

    let sq: Square = {}
    

    此处,typescript引发了一个错误,说明属性 width 遗失 sq . 这与上面的强制转换语法有什么不同?这也是 snippet from typescript-playground .

    1 回复  |  直到 6 年前
        1
  •  5
  •   Titian Cernicova-Dragomir    6 年前

    类型断言强制编译器接受不安全的类型。因此,当使用类型断言时,编译器将接受 {} Square 尽管它显然不符合接口。

    let sq: Square 类型由注释决定,并且将严格检查赋值与变量类型的对应关系,您将得到一个错误

    从运行时的角度来看,两者之间没有区别,在这两种情况下,编译后剩下的就是

    一般来说,您应该避免类型断言。类型断言告诉编译器:“忽略你认为是真的,程序员更清楚!”.有些情况下需要类型断言,但除非您确定需要类型断言,否则应避免使用它们,并尝试修复问题,使类型正确。使用类型断言可能会得到令人惊讶的结果。例如:

    interface Square {
        width: number
    }
    let square = <Square>{}
    square.width.toExponential() // runtime error, the type did not really reflect the runtime object
    
    let sq:Square = {} // error here at compile time here 
    sq.width.toExponential() 
    
    推荐文章