2016-12-15 47 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 
相关问题