Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使TypeScript接口成为两种可能的类型之一,其中一种是数组?_Typescript - Fatal编程技术网

如何使TypeScript接口成为两种可能的类型之一,其中一种是数组?

如何使TypeScript接口成为两种可能的类型之一,其中一种是数组?,typescript,Typescript,我正在努力: type SkuItem = ChildSkuItem & { childSkus: ChildSkuItem[], }; type GetSkuItemsResponseType = Partial<Array<SkuItem>> & { errorCode?: string; errorMessage?: string; } Partial<GetSkuItemsErrSkuResponse> {

我正在努力:

type SkuItem = ChildSkuItem & {
    childSkus: ChildSkuItem[],
};

type GetSkuItemsResponseType = Partial<Array<SkuItem>> & {
    errorCode?: string;
    errorMessage?: string;
}

Partial<GetSkuItemsErrSkuResponse> { }
export interface GetSkuItemsResponse extends GetSkuItemsResponseType { }

@shamoon-如果您使用“or”(|)而不是“and”(&),则您的类型适合您想要的类型。但是,您不能将其作为接口,因为类可以实现接口,并且不能轻松实现两种可能类型中的一种或另一种。考虑下面的代码——这不是你想要的吗?
interface ChildSkuItem {
    id: number;
    value?: string;
}
type SkuItem = ChildSkuItem & {
    childSkus: ChildSkuItem[],
};
type GetSkuItemsResponseType = Partial<Array<SkuItem>> | {
    errorCode?: string;
    errorMessage?: string;
}
// Can't make GetSkuItemsResponseType into an interface with this definition...
//interface GetSkuItemsResponse extends GetSkuItemsResponseType { }

function test() {
    const sku1: ChildSkuItem = { id: 1, value: "A Value" };
    const sku2: ChildSkuItem = { id: 2 };
    const sku3: ChildSkuItem = { id: 3 };
    const skuItem1: SkuItem = { id: 104, childSkus: [sku1, sku2] };
    const skuItem2: SkuItem = { id: 105, childSkus: [sku3] };
    // GetSkuItemsResponseType can have error info...
    const rt: GetSkuItemsResponseType = { errorCode: "100", errorMessage: "screwed" };
    // ...or it can have an array of skuItems
    const rt2: GetSkuItemsResponseType = [skuItem1, skuItem2];
};
接口项{
id:编号;
值?:字符串;
}
类型SkuItem=ChildSkuItem&{
childSkus:ChildSkuItem[],
};
类型GetSkuItemsResponseType=Partial |{
错误代码?:字符串;
errorMessage?:字符串;
}
//无法使GetSkuItemsResponseType成为具有此定义的接口。。。
//接口GetSkuItemsResponse扩展了GetSkuItemsResponseType{}
功能测试(){
const sku1:ChildSkuItem={id:1,值:“A值”};
常量sku2:ChildSkuItem={id:2};
const sku3:ChildSkuItem={id:3};
const skuItem1:SkuItem={id:104,childSkus:[sku1,sku2]};
常量skuItem2:SkuItem={id:105,childSkus:[sku3]};
//GetSkuItemsResponseType可能有错误信息。。。
const rt:GetSkuItemsResponseType={errorCode:“100”,errorMessage:“screwed”};
//…或者它可以有一个项目数组
常量rt2:GetSkuItemsResponseType=[skuItem1,skuItem2];
};

&
并不意味着“或”,您的类型要求一个值同时是这两个值。那么我该如何将其设置为“或”?我尝试了
|
,但后来我得到了
一个接口只能扩展一个对象类型或对象类型与静态已知成员的交集
有没有办法说如果它不是一个
SkuItem
数组,那么它必须同时包含
errorCode
errorMessage
,我有两个错误:`Property'errorMessage'在类型'GetSkuItemsResponse'上不存在。`Property'errorMessage'在类型'(SkuItem |未定义)[]上不存在。`您不能拥有正确的代码:GetSkuItemsResponse在上面被注释掉,根本不存在!抱歉-我在我的上下文中使用它。这将是
GetSkuItemsResponseType
在回答您前面的问题时,重新强制执行errorCode和errorMessage,只需键入GetSkuItemsResponseType=SkuItem[]|{errorCode:string;errorMessage:string;}。这仍然允许空数组和null,但是如果您有一个对象,它必须具有这两个属性。
interface ChildSkuItem {
    id: number;
    value?: string;
}
type SkuItem = ChildSkuItem & {
    childSkus: ChildSkuItem[],
};
type GetSkuItemsResponseType = Partial<Array<SkuItem>> | {
    errorCode?: string;
    errorMessage?: string;
}
// Can't make GetSkuItemsResponseType into an interface with this definition...
//interface GetSkuItemsResponse extends GetSkuItemsResponseType { }

function test() {
    const sku1: ChildSkuItem = { id: 1, value: "A Value" };
    const sku2: ChildSkuItem = { id: 2 };
    const sku3: ChildSkuItem = { id: 3 };
    const skuItem1: SkuItem = { id: 104, childSkus: [sku1, sku2] };
    const skuItem2: SkuItem = { id: 105, childSkus: [sku3] };
    // GetSkuItemsResponseType can have error info...
    const rt: GetSkuItemsResponseType = { errorCode: "100", errorMessage: "screwed" };
    // ...or it can have an array of skuItems
    const rt2: GetSkuItemsResponseType = [skuItem1, skuItem2];
};