错误 TS2339:自定义界面的类型上不存在属性“过滤器”

San*_*ord 2 typescript angular

我为一组对象创建了一个接口

export interface UpdateMediaList {
    [index: number]: ContactResponse;
}

interface ContactResponse {
    contactId: number;
    email: string;
    firstName: string;
    imgDisplayPath: string;
    inMediaList: true;
    jobTitle: string;
    lastName: string;
    mediaOutletId: number;
    mediaOutletName: string;
    openRate: string;
    phone: string;
    responseRate: string;
    secureRate: string;
}
Run Code Online (Sandbox Code Playgroud)

然后我在我的服务中使用它......

postUpdateMediaList(param, body, url = this.urls.mediaList.updateMediaList) {
    let params = new HttpParams();
    params = params.set('sortType', param.sortType);
    params = params.set('numRows', param.numRows);
    params = params.set('startRow', param.startRow);
    return this.http.post<UpdateMediaList>(url, body, {params: params});
}
Run Code Online (Sandbox Code Playgroud)

现在我收到了这个错误

ERROR in src/app/modules/media-list/containers/media-list-builder/media-list-builder.component.ts(142,22): error TS2339: Property 'filter' does not exist on type 'UpdateMediaList'
Run Code Online (Sandbox Code Playgroud)

这是在这个代码块中:

this.mediaList = response
    .filter(items => items.inMediaList === true)
    .map(items => items.contactId);
while (this._contacts.value.length !== 0) {
    this._contacts.removeAt(0);
}
Run Code Online (Sandbox Code Playgroud)

jca*_*alz 5

你的定义:

export interface UpdateMediaList {
    [index: number]: ContactResponse;
}
Run Code Online (Sandbox Code Playgroud)

没有定义 TypeScript Array,而只是一个带有数字键的对象,其值为ConstactResponse对象。AnArray<T>确实具有数字键控属性,但它也具有您显然依赖的所有Array方法,例如filter()

这是符合您UpdateMediaList定义的内容:

declare const someContactResponse: ContactResponse;
const weirdUpdateMediaList: UpdateMediaList = {0: someContactResponse};
Run Code Online (Sandbox Code Playgroud)

如您所见,weirdUpdateMediaList具有数字键属性但不是数组。您不想允许此代码:

weirdUpdateMediaList.filter(x => true); // error at compile time
Run Code Online (Sandbox Code Playgroud)

因为它会在运行时爆炸weirdUpdateMediaList.filter is not a function


假设你实际上是Array从你的后端得到一个,那么你应该Array像这样使用而不是你的定义UpdateMediaList

export type UpdateMediaList = Array<ContactResponse>;
Run Code Online (Sandbox Code Playgroud)

或者,等效地

export type UpdateMediaList = ContactResponse[];
Run Code Online (Sandbox Code Playgroud)

然后,如果你尝试这个,你会得到一个错误:

const weirdUpdateMediaList: UpdateMediaList = {0: someContactResponse}; 
// error!  not assignable to type 'ContactResponse[]'.
//   Property 'length' is missing in type '{ 0: ContactResponse; }'.
Run Code Online (Sandbox Code Playgroud)

并且可以安全地假设任何类型的对象UpdateMediaList都是具有Array您需要的所有方法的实际对象。

那有意义吗?祝你好运。