首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将接口应用于HTTP响应

如何将接口应用于HTTP响应
EN

Stack Overflow用户
提问于 2019-09-09 19:22:32
回答 3查看 374关注 0票数 1

在我的应用程序中,我得到了一个API的响应,该API具有如下模式的响应。

代码语言:javascript
复制
export interface IApiResponseBody<T = any> {
    Error?: string;
    Message?: string;
    RowsAffected?: number;
    Success?: boolean;
    Data?: T;
    RowCount?: number;
}

我没有问题将接口分配给响应,然后让我访问响应中的元素。当我试图通过DataT分配一个接口时,我遇到了一个问题,比如

代码语言:javascript
复制
let myData: IApiResponseBody<IPerson>  = {
    Success: true,
    Error: "",
    Message: "",
    RowsAffected: 9,
    Data: [{name: 'Steve', age: 26, gender : 'male'},
            {name: 'Susan', age: 21, gender : 'female'},
            {name: 'SteveFrank', age: 29, gender : 'male'}]}

无论是在Data中使用数组还是使用简单的Doc,我都会得到一个错误。

TSError:无法编译TypeScript: index.ts:9:5 - error TS2559: Type '{ name: string;age: number;性别: string;}[]‘与类型'IPerson’没有共同的属性。 9数据:[{姓名:“Steve”,年龄: 26岁,性别:“男性”},

因此,无论是文档数组还是简单文档,如何将接口应用到我的Data元素。

下面是指向Repl.it上上述代码的链接

示例游乐场

EN

回答 3

Stack Overflow用户

发布于 2019-09-09 20:01:50

你可以试试:

代码语言:javascript
复制
export interface IApiResponseBody<T = any> {
    Error?: string;
    Message?: string;
    RowsAffected?: number;
    Success?: boolean;
    [key: string]?: T | T[];
    RowCount?: number;
}

以及:

代码语言:javascript
复制
let myData: IApiResponseBody<IPerson>  = {
    Success: true,
    Error: "",
    Message: "",
    RowsAffected: 9,
    Data: [{name: 'Steve', age: 26, gender : 'male'}] // or {name: 'Steve', age: 26, gender : 'male'}
    }
票数 1
EN

Stack Overflow用户

发布于 2019-09-09 19:39:25

因为,您希望访问可能不存在的数据。因为Data?:T[]是数据的速记:未定义的数据( T[] )。这意味着数据可能包含T[]的值,也可能包含未定义的值。

因此,当您调用myData.data.name时,它的意思是,它可能具有steve值,或者您希望调用未定义数据的第一个对象的name属性,这是完全不可接受的,因此错误被抛出。

解决方案1:

您可以先检查数据是否存在,然后打印对象或对象的属性。

代码语言:javascript
复制
if (myData.Data) {
  console.log(myData.Data[0].name)
}

解决方案2

或者您可以说必须有数据,从接口中删除?字符。

代码语言:javascript
复制
export interface IApiResponseBody<T = any> {
  Error?: string;
  Message?: string;
  RowsAffected?: number;
  Success?: boolean;
  Data: T[];
  RowCount?: number;
}

实时解决方案:Repl.it

票数 0
EN

Stack Overflow用户

发布于 2019-09-09 19:42:30

Data?必须是T类型的数组,或者如果要允许数组或单个对象,请使用联合。

代码语言:javascript
复制
export interface IApiResponseBody<T = any> {
  Error?: string;
  Message?: string;
  RowsAffected?: number;
  Success?: boolean;
  Data?: T | T[];
  RowCount?: number;
}

export interface IPerson {
  name?: string;
  gender?: string;
  age?: number;
}

现在你可以这样做:

代码语言:javascript
复制
let myData: IApiResponseBody<IPerson> = {
  Success: true,
  Error: "",
  Message: "",
  RowsAffected: 9,
  Data: [
    {name: 'Steve', age: 26, gender: 'male'},
    {name: 'Susan', age: 21, gender: 'female'},
    {name: 'SteveFrank', age: 29, gender: 'male'}
  ]
}

或者:

代码语言:javascript
复制
let myData: IApiResponseBody<IPerson> = {
  Success: true,
  Error: "",
  Message: "",
  RowsAffected: 9,
  Data: {name: 'Steve', age: 26, gender: 'male'}
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57860085

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档