2017-05-27 32 views
3

是否有可能在TypeScript中的接口声明中有条件。我正在寻找的是一种方式来说,根据第一个键的值,第二个键可以是这些值。Javascript条件内部TypeScript接口

例(非工作):

interface getSublistValue { 

    /** The internal ID of the sublist. */ 
    sublistId: 'item' | 'partners'; 

    /** The internal ID of a sublist field. */ 
    if (this.sublistId === 'item') { 
     fieldId: 'itemname' | 'quantity'; 
    } 

    if (this.sublistId === 'partners') { 
     fieldId: 'partnername' | 'location'; 
    } 
} 

回答

5

没有有没有。最好的办法是创建描述两种不同类型数据的独立接口。

例如:

interface SublistItem { 
    sublistId: 'item'; 
    fieldId: 'itemname' | 'quantity'; 
} 

interface SublistPartners { 
    sublistId: 'partners'; 
    fieldId: 'partnername' | 'location'; 
} 

function getData(): SublistItem | SublistPartners { 
    return (Math.random() < 0.5) 
     ? { sublistId: 'item', fieldId: 'itemname' } 
     : { sublistId: 'partners', fieldId: 'partnername' }; 
} 

const someValue = getData(); 

if (someValue.sublistId === "item") { 
    // SublistItem in here 
} 
else { 
    // SublistPartners in here 
} 
+0

所以,如果我用,当我创造了'someValue'对象我仍然得到所有4个选项'fieldId'与自动完成,但至少它给了我一个警告这种方法如果sublistId和fieldId不匹配(即'item'和'partnername')。得到我的是,如果我的'someValue'是'const someValue:SublistItem | SublistPartners = { sublistId:'partners', fieldId:'location' };'然后我得到'if(someValue.sublistId ==='item'){}'条件说'location'是不是'itemname'或'quantity',我已经知道了,为什么我会得到这个警告? –

+0

@JonLamb嗯......显示的错误信息是没有用的。在这种情况下,它知道'sublistId'只会是''partners'',因此当您检查“item”时会引发错误。如果你用“合作伙伴”替换“item”,那么它会起作用。尝试一种情况,你从某处收到一个值,但你不确定数据是什么。我更新了这个例子。 –