数组和对象类型的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(正如问题中提到的)。为了更清晰,更新了问题。