2016-03-01 122 views
7

什么来处理,你有两个接口是非常相似,以至于你想通过同一块逻辑来运行它们的情况下正确的方法处理:打字稿联盟类型:与接口

interface DescriptionItem { 
    Description: string; 
    Code: string; 
} 
interface NamedItem { 
    Name: string; 
    Code: string; 
} 

function MyLogic(i: DescriptionItem | NamedItem) { 
    var desc = (<DescriptionItem>i).Description || (<NamedItem>i).Name; 

    return i.Code + ' - ' + desc; 
} 

这工作;不过,我的问题在于改进var desc = ...系列。我有什么最好的选择?或者是否有更好的方法来处理Typescript中的这种情况?

+0

我会说,你所采取的方式看起来很好。然而,问题本身主要是基于意见的,我将在此基础上投票结束。 :) – toskv

回答

5

TypeScript interfaces仅在编译时存在,所以在运行时测试接口类型的操作并不多。您在问题中指定的代码很有意义,可能是您的最佳选择。

但是,如果能够灵活地改变你的interfacesclasses,您可以使用打字稿的类型卫士做更优雅的类型检查:

class DescriptionItem { 
    Description: string; 
    Code: string; 
} 
class NamedItem { 
    Name: string; 
    Code: string; 
} 

function MyLogic(i: DescriptionItem | NamedItem) { 
    let desc: string; 
    if (i instanceof DescriptionItem) { 
     desc = i.Description; 
    } else { 
     desc = i.Name; 
    } 

    return i.Code + ' - ' + desc; 
} 
+0

为什么你不能检查'i.Name'是否存在,并根据它来区分类型? – jocull

+0

@jocull如果该对象是'NamedItem'的一个实例,但是它的'Name'是'undefined',会怎么样? –

+0

如果它缺少非可选数据,那它真的是'NamedItem'的一个实例吗? – jocull