在我的应用程序中,我得到了一个API的响应,该API具有如下模式的响应。
export interface IApiResponseBody<T = any> {
Error?: string;
Message?: string;
RowsAffected?: number;
Success?: boolean;
Data?: T;
RowCount?: number;
}我没有问题将接口分配给响应,然后让我访问响应中的元素。当我试图通过Data为T分配一个接口时,我遇到了一个问题,比如
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上上述代码的链接
发布于 2019-09-09 20:01:50
你可以试试:
export interface IApiResponseBody<T = any> {
Error?: string;
Message?: string;
RowsAffected?: number;
Success?: boolean;
[key: string]?: T | T[];
RowCount?: number;
}以及:
let myData: IApiResponseBody<IPerson> = {
Success: true,
Error: "",
Message: "",
RowsAffected: 9,
Data: [{name: 'Steve', age: 26, gender : 'male'}] // or {name: 'Steve', age: 26, gender : 'male'}
}发布于 2019-09-09 19:39:25
因为,您希望访问可能不存在的数据。因为Data?:T[]是数据的速记:未定义的数据( T[] )。这意味着数据可能包含T[]的值,也可能包含未定义的值。
因此,当您调用myData.data.name时,它的意思是,它可能具有steve值,或者您希望调用未定义数据的第一个对象的name属性,这是完全不可接受的,因此错误被抛出。
解决方案1:
您可以先检查数据是否存在,然后打印对象或对象的属性。
if (myData.Data) {
console.log(myData.Data[0].name)
}解决方案2
或者您可以说必须有数据,从接口中删除?字符。
export interface IApiResponseBody<T = any> {
Error?: string;
Message?: string;
RowsAffected?: number;
Success?: boolean;
Data: T[];
RowCount?: number;
}实时解决方案:Repl.it
发布于 2019-09-09 19:42:30
Data?必须是T类型的数组,或者如果要允许数组或单个对象,请使用联合。
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;
}现在你可以这样做:
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'}
]
}或者:
let myData: IApiResponseBody<IPerson> = {
Success: true,
Error: "",
Message: "",
RowsAffected: 9,
Data: {name: 'Steve', age: 26, gender: 'male'}
}https://stackoverflow.com/questions/57860085
复制相似问题