作者:匍匐着前进中 | 来源:互联网 | 2022-11-23 12:42
我正在阅读打字稿中的接口,并遇到以下内容.
命名接口Square
定义如下:
interface Square {
width: number
}
然后square
通过将对象文字Square
类型转换为类型来声明名为变量:
let square = {}
我试着印刷square
和typeof square
其预期给出了{}
和object
.但我无法将上述square
定义与以下内容区分开来:
let sq: Square = {}
这里的打字稿会抛出一个错误,说明该属性width
丢失了sq
.这与上面的转换语法有何不同?这里也是typescript-playground的片段.
1> Titian Cerni..:
类型断言强制编译器接受非类型安全的东西.所以,当你使用一个类型断言编译器将接受{}
是一个Square
即使它显然不符合该接口.
当您显式注释变量时,let sq: Square
类型由注释确定,并且将根据变量类型严格检查赋值,并且您将收到{}
不符合接口的错误.
从运行时的角度来看,两者之间没有区别,在两种情况下,编译后剩下的是对{}
变量的赋值,类型(在注释和类型断言中)都被编译器完全擦除.
通常你应该避免类型断言.类型断言告诉编译器:"忽略你认为是真的我程序员知道的更好!".在某些情况下,类型断言是必要的,但除非您确定需要类型断言,否则应该避免使用它们,并尝试修复问题以使类型正确.使用类型断言可能会得到令人惊讶的结果.例如:
interface Square {
width: number
}
let 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()