2017-04-17 35 views
0

考慮下面的代碼塊爲什麼即使界面中存在不需要的屬性,typescript也不會拋出錯誤?

interface Store { 
    loading: boolean; 
} 

interface StoreMethod { 
    (s: Store): Store; 
} 

export const createStore: StoreMethod = (store) => { 
    return { ...store, working: false }; 
} 


export const loadStore: StoreMethod = (store) => { 
    return { loading: true, working: false }; 
} 

我期待打字稿,因爲在返回的對象應該是Store不具有財產working拋出一個錯誤。我錯過了什麼嗎?

你可以檢查遊樂場here的代碼。

回答

3

你需要明白打字稿transpiles你的代碼爲普通的JavaScript,它沒有接口的概念。

在打字原稿類型AB如果A具有所有B確實但是A不必具有B具有性質的確切數目的屬性的類型兼容,A具有至少具有B所做的那些屬性,又名A可能包含B中不存在的其他屬性。所以這個功能

export const loadStore: StoreMethod = (store) => { 
    return { loading: true, working: false }; 
} 

返回的對象顯然有PROPERT稱爲loading這satifies的合同Store強加,所以返回的對象被認爲是兼容Store,如果從返回的對象中刪除loading財產,打字稿會抱怨。

打字稿中的界面是設計工件,它在運行時不存在。

+0

那麼我應該怎麼做,如果我想要完全相同的屬性? – Neo

+1

然後你只需要修改你的代碼就可以了,在編譯的時候沒有辦法強制它 – Dummy

相關問題