数组和对象类型的Typescript并集

数组和对象类型的Typescript并集,typescript,Typescript,Typescript编译器在尝试使用联合或多个类型/接口时不断抛出错误 我的要求 我从服务器接收到一个对象作为响应,其中一个键('errorMessages')的数据类型为string[],另一个键('data')可以是对象或数组。我为此编写了一个界面,如下所示: 接口myserver响应{ 错误消息:字符串[]; 数据:{ 标题:字符串[]; 正文:任何[]; }|任何[]>; } 尝试访问'headers'时收到编译器错误 属性'headers'不存在于类型'any[]|{headers:

Typescript编译器
在尝试使用联合或多个类型/接口时不断抛出错误

我的要求

我从服务器接收到一个对象作为响应,其中一个键('errorMessages')的数据类型为
string[]
,另一个键('data')可以是
对象
数组
。我为此编写了一个
界面
,如下所示:

接口myserver响应{
错误消息:字符串[];
数据:{
标题:字符串[];
正文:任何[];
}|任何[]>;
}
尝试访问'headers'时收到编译器错误

属性'headers'不存在于类型'any[]|{headers:string[];body:any[][];}'

难道不可能像对
number | boolean
string | null
等使用联合来实现这一点吗

如果我们有一个具有联合类型的值,那么我们只能访问联合中所有类型通用的成员

因此,您会收到错误,因为“头”在联合体中的类型中并不常见

如果我们有一个具有联合类型的值,那么我们只能访问联合中所有类型通用的成员


因此,您会收到错误,因为“头”在联合中的所有类型中都不常见。

当您有一个类型联合时,您只能访问所有类型通用的成员。如果你想说它是一个或另一个,你需要一个让编译器知道它是正确的类型:

// this type isn't needed but it makes the code more readable
type headersBody = { headers: string[]; body: any[][] }; 

function isHeadersBody(obj: headersBody | any[]): obj is headersBody {
    return !Array.isArray(obj);
    // or better yet
    // return Array.isArray(obj["headers"]) && Array.isArray(obj["body"]);    
}

let obj: headersBody | any[];

if (isHeadersBody(obj)) {
    console.log(obj.body.length);
}

当您有一个类型联合时,您只能访问所有类型通用的成员。如果你想说它是一个或另一个,你需要一个让编译器知道它是正确的类型:

// this type isn't needed but it makes the code more readable
type headersBody = { headers: string[]; body: any[][] }; 

function isHeadersBody(obj: headersBody | any[]): obj is headersBody {
    return !Array.isArray(obj);
    // or better yet
    // return Array.isArray(obj["headers"]) && Array.isArray(obj["body"]);    
}

let obj: headersBody | any[];

if (isHeadersBody(obj)) {
    console.log(obj.body.length);
}

要通知TypeScript您希望使用哪些接口,您可以在此特定函数中强制转换变量:

interface dataTypeResponse {
    headers: string[];
    body: any[][];
}

interface MyServerResponse {
    errorMessages: string[];
    data: dataTypeResponse | any[];
}

doTheMagic(d: MyServerResponse) {
   // access it like this:
   const headers = (<dataTypeResponse>d.data).headers;
}
接口数据类型响应{
标题:字符串[];
正文:任何[];
}
接口myserver响应{
错误消息:字符串[];
数据:dataTypeResponse | any[];
}
doTheMagic(d:MyServerResponse){
//按如下方式访问它:
const headers=(d.data).headers;
}

要告知TypeScript您希望哪些接口可以在此特定函数中强制转换变量,请执行以下操作:

interface dataTypeResponse {
    headers: string[];
    body: any[][];
}

interface MyServerResponse {
    errorMessages: string[];
    data: dataTypeResponse | any[];
}

doTheMagic(d: MyServerResponse) {
   // access it like this:
   const headers = (<dataTypeResponse>d.data).headers;
}
接口数据类型响应{
标题:字符串[];
正文:任何[];
}
接口myserver响应{
错误消息:字符串[];
数据:dataTypeResponse | any[];
}
doTheMagic(d:MyServerResponse){
//按如下方式访问它:
const headers=(d.data).headers;
}

身体上不应该有
任何[]
吗<代码>接口MyServerResponse{errorMessages:string[];数据:{标题:string[];正文:任意[]【】【】;}否,数据中的
正文
键始终是
任意[]
。我想要数据键上的union(正如问题中提到的)。更新了问题以使其更加清晰。
any[]
不应该出现在正文上吗<代码>接口MyServerResponse{errorMessages:string[];数据:{标题:string[];正文:任意[]【】【】;}否,数据中的
正文
键始终是
任意[]
。我想要数据键上的union(正如问题中提到的)。为了更清晰,更新了问题。