我注意到以下行为:类型断言VS性能
interface User {
name: string;
age: number;
}
let user:User = {
name: "Aaron",
age: 99
}
如果我省略age: 99
我得到一个编译错误。 这是我期望的行为。
但是:
function putUser(user:User):void { }
putUser(<User> {
name: "Aaron"
});
我得到缺少非可选属性age
没有编译错误。
事实上,在我真正的代码库,我发现用
铸造
类型断言我有时可以添加完全错误的属性的对象字面,但我无法重现的这种行为简单的情况就像上面。
任何人都可以解释这里发生了什么?
编辑:省略断言作品,感谢@Amid。然而,当我遇到了这个作为一个问题是这样的情景:
interface User { name: string; }
function putUser(user:User):void { }
interface Musician extends User { instrument: string; }
putUser(<Musician> {
name: "Bob Dylan"
});
的问题是,我想验证Musician
对象,但只putUser
预计该基地User
对象。我认为类型断言会给我更好的类型安全性,但在这种情况下,它实际上减少了类型安全性。
编辑#2
它看起来像我能得到我想要使用泛型类型约束,这实际上看起来一个可怕的很多像我喜欢的类型声明:
function putUser<T extends User>(user:T):void { }
putUser<Musician>({
name: "Bob Dylan",
instrument: "Guitar"
});
在这种情况下,它似乎会确保对象文字恰好是Musician
的实现。
望着规范,' obj'不是演员,而是一个说法,'obj'已键入'User'。类型断言不会在运行时检查,请参阅[这里](https://github.com/Microsoft/TypeScript/blob/master/doc/spec.md#4.16) –
Lee
是的,你是对的我把它称为一个演员,但它是一个断言......是否有一个“真正的”演员,然后呢? – Aaron
这是[文档](https://github.com/Microsoft/TypeScript/wiki/Breaking-Changes#typescript-16)绕过“严格的对象字面值分配检查”的方法之一。 –