2017-08-07 33 views
1

我發現其中一個接口被用來代替一類在我的項目的地方,是這樣的:可以在TypeScript中將數據作爲接口傳遞嗎?

function test(car: ICar) { 
//do something 
} 

this.test({mark: "Volvo", colour: "red"}); 

它是確定遵循這一做法,還是應該適當班級被改寫?

+0

TypeScript使用*結構打字*。只要可以顯示對象,確認它是'該'類型,並被認爲是類型安全的。因此,如果ICar(僅)需要「標記」和「顏色」,則提供的對象(其具有推斷的類型信息)是有效的;而「應該重寫[作爲一個階級]」的問題大多是主觀的,雖然可以提出論據。我的建議是:編寫/設計代碼,以便將來爲您和其他人更容易*更容易地修改*。 – user2864740

+1

例如,可以爲一個具有適當實例的類創建一個參數,例如,如果添加了新的「樣式」(coupe,轎車,掀背車等)屬性,該怎麼辦?使用類可以使用默認值(或通過構造函數強制);只需要進行結構分型,所有的對象都需要更新以符合更新後的ICar--即當只依賴結構化分類時,添加到接口是一個*重大改變*。如果在單元編譯失敗時更新使用地點是可行/可行的,則這種重大更改對於僅限內部類型*而言不一定是壞的。 – user2864740

回答

4

該對象是完全可以接受的ICar(假設它的定義爲我們將推斷的...)。

您不需要僅僅因爲使用TypeScript而使用類 - 它們是類型系統的正交概念,只能在需要時使用。

+1

謝謝你快速回答!雖然這種類型的代碼難以閱讀,比如this.test(new Car(...))IMO應該比this.test({...})更容易閱讀? 我也想知道更改,例如當我更新Car界面時,我將不得不更新所有我啓動它的地方。 – Mikhail

+0

關於使用'new'關鍵字的代碼本質上沒有可讀性。如果你以前只寫過強制OOP語言,這可能有點意外。 –

1
function test(car: ICar) { 
    ... 
} 

功能告訴外面的世界,它只會接受一個對象作爲實現該ICar接口局部變量car參數。

沒有接口傳遞到任何地方。

認爲它是一個保鏢,只允許某些輸入。

this.test({mark: "Volvo", colour: "red"}); 

是測試功能與物體,其可以或可以不履行接口ICar的呼叫。

檢查打字稿只能在編譯時工作,所以除非你在通過tsc運行編譯器時沒有看到錯誤,否則它可能沒問題。

請記住,如果在運行時傳遞不同的類型,將不會有檢查,因此代碼可能是錯誤的。

相關問題