我注意到以下行爲:類型斷言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)繞過「嚴格的對象字面值分配檢查」的方法之一。 –