2016-12-15 53 views
0

從無類型語言JavaScript到類型化TypeScript,您開始使用接口。關於如何構建一個應用程序轉成暴力討論,我的隊友:)我們正在建設有時簡單的問題作出反應+終極版+打字稿應用程序,我們有兩個「東西」:爲用戶(終極版店內用戶代表)應用程序狀態和用戶(描述JSON API響應)的API響應,它們都具有接口,到目前爲止,接口是相同的,但是這可能會改變。映射是使用一些自定義的函數來完成:兩個單獨的接口或一個擴展另一個接口:幹或不烘乾

const mapUserApiToState = (user: IUserAPI): IUserState => { ... } 

因爲它是一個早期的階段,會有很多的接口,寫有兩個或三個路徑,我們可以採取:

(1)獨立每個接口分別放入自己的文件。但是你必須爲違反DRY原則的每個接口重複相同的屬性。

// file1.ts 
interface IUserState { 
    id: number; 
    name: string; 
    kids: number; 
} 

// file2.ts 
interface IUserAPI { 
    id: number; 
    name: string; 
    kids: number; 
} 

(2)僅有延伸與另一一個接口。這樣,你就不需要再重複自己,但是這將意味着一個接口擴展另一個,而實際上他們看起來是一樣的,但對完全不同的目的

// file1.ts 
interface IUserState { 
    id: number; 
    name: string; 
    kids: number; 
} 

// file2.ts 
interface IUserAPI extends IUser {} 

(3)創建一些抽象的第三界面。但是,這將創建一個多個文件與界面,不應使用(在那裏你會使用IUSER?)

// file1.ts 
interface IUser { 
    id: number; 
    name: string; 
    kids: number; 
} 

// file2.ts 
interface IUserState extends IUser {} 

// file3.ts 
interface IUserAPI extends IUser {} 

(4)退出縮腰的時間上瑣碎的事情。 YAGNI。

+1

幾個問題我會問自己,在這種情況下:有兩個接口** **可能發散?如果應用程序不同步,應用程序是否會崩潰?你可以合併它們而不是將它們更多地抽象出來,以便擁有1個接口而不是2個或3個接口? – alebianco

+1

@mseimys在第三種情況下,你爲什麼會說'IUser'不會被使用?該接口已經是其他接口「IUserState」和「IUserAPI」的一部分。你不會用它來保存這兩個派生接口的結構信息嗎?我的意思是,只要有共同的改變,你就會修改那個界面,對吧? – Leone

+0

@Leone是的,我會在這個'IUser'接口持有共同的屬性,但我認爲 這是不明智的任何地方使用它,在這種情況下,其他兩個是擺在首位完全無用 ,所以我的問題:)好我的例子可能看起來微不足道,但 想象有幾十複雜的屬性, 像'點:[{ISVISIBLE:真,標題: 「標題」,標籤:[1,2,3]}]' – mseimys

回答

0

經過多次辯論之後,我們決定使用TypeScript的typeof功能,並決定複製變量的枚舉,但不是使用兩個接口,而是使用默認應用程序狀態的值作爲我們類型的定義。所以它和兩個界面不一樣,但是更有意義。

interface IUserAPI { 
    id: number; 
    name: string; 
    kids: number; 
} 

const defaultUserState = { 
    id: 0, 
    name: "Unnamed", 
    kids: 0 
} 

type IUserState = typeof defaultUserState 
相關問題