Javascript条件内部类型脚本接口

Javascript条件内部类型脚本接口,javascript,typescript,Javascript,Typescript,是否可能在TypeScript中的接口声明中包含条件。我要寻找的是一种方式,根据第一个键的值,第二个键可以是这些值 示例(无功能): 没有。最好的做法是创建单独的接口来描述两种不同类型的数据 例如: interface SublistItem { sublistId: 'item'; fieldId: 'itemname' | 'quantity'; } interface SublistPartners { sublistId: 'partners'; fie

是否可能在TypeScript中的接口声明中包含条件。我要寻找的是一种方式,根据第一个键的值,第二个键可以是这些值

示例(无功能):


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

例如:

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
}
接口子系统{
子列表:“项目”;
fieldId:'itemname'|'quantity';
}
接口子列表伙伴{
子列表:“合作伙伴”;
fieldId:“partnername”|“location”;
}
函数getData():SublistItem | SublistPartners{
返回值(Math.random()<0.5)
?{sublistId:'item',fieldId:'itemname'}
:{sublistId:'partners',fieldId:'partnername'};
}
const someValue=getData();
如果(someValue.sublistId==“项”){
//这里的子系统
}
否则{
//我在这里
}

如果你想完全分离你的界面,你可以这样做:

例如,子列表.model.ts

接口子系统{
子列表:“项目”;
fieldId:'itemname'|'quantity';
}
接口子列表伙伴{
子列表:“合作伙伴”;
fieldId:“partnername”|“location”;
}
导出类型子列表=子列表项|子列表伙伴;

现在,您可以使用子列表类型,它将根据您提供的字段值正确推断它是SublistPartners类型还是SublistItem类型。

您可以尝试使用条件类型解决此问题:

接口子系统{
子列表:“项目”;
fieldId:'itemname'|'quantity';
}
接口子列表伙伴{
子列表:“合作伙伴”;
fieldId:“partnername”|“location”;
}
类型ConditionalPublist=bIsSublistItem扩展为true?分公司:分公司合伙人;
let子列表项:ConditionalPublist={
fieldId:“itemname”,
子列表:“项目”
};
let sublistPartner:ConditionalPublist={
fieldId:“partnername”,
子列表:“合作伙伴”
};

因此,如果我在创建
someValue
对象时使用此方法,我仍然可以通过autocomplete获得
fieldId
的所有4个选项,但如果SubList和fieldId不匹配(即“item”和“partnername”),至少它会给我一个警告。让我明白的是,如果我的
someValue
constsomevalue:SublistItem | SublistPartners={sublistId:'partners',fieldId:'location'}
然后我在
if(someValue.sublistId=='item'){}
条件上得到一个警告,说
位置
不是
项目名
数量
,我已经知道,为什么我会得到这个警告?@JonLamb hmmm。。。为此显示的错误消息没有帮助。在这种情况下,它知道
sublistId
将仅是
'partners'
,因此当您检查
'item'
时,它会抛出一个错误。如果将
'item'
替换为
'partners'
,则它将正常工作。尝试一个场景,您从某处接收到一个值,但不确定数据将是什么。我已经更新了示例。这是我一直在寻找的完美答案,谢谢
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
}