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