angular - hiba TS2339: A 'filter' tulajdonság nem létezik a felhasználói felület típusában
Létrehoztam egy interfészt egy objektum tömbhöz
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;
}
és aztán a szolgáltatásomban használom ...
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});
}
és most ezt a hibát kapom
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'
Melyik van ebben a kódrészletben:
this.mediaList = response
.filter(items => items.inMediaList === true)
.map(items => items.contactId);
while (this._contacts.value.length !== 0) {
this._contacts.removeAt(0);
}
Válasz #1
A te meghatározásod:
export interface UpdateMediaList {
[index: number]: ContactResponse;
}
nem határoz meg egy TypeScript Array-t, hanem csak egy számokkal rendelkező kulcsokkal rendelkező objektumot, amelynek értékei ConstactResponse objektumok. Egy Array<T> valóban rendelkezik számokra mutató kulcsokkal, de emellett minden Array metódust is tartalmaz, mint például a filter(), amelyre nyilvánvalóan támaszkodni próbálsz.
Itt van valami, ami megfelel a UpdateMediaList definíciódnak:
declare const someContactResponse: ContactResponse;
const weirdUpdateMediaList: UpdateMediaList = {0: someContactResponse};
Amint látható, a weirdUpdateMediaList egy numerikus kulcsú tulajdonsággal rendelkezik, de nem tömb. Nem szeretnéd megengedni ezt a kódot:
weirdUpdateMediaList.filter(x => true); // error at compile time
mert futásidőben felrobbanna a weirdUpdateMediaList.filter nem egy függvény hibával.
Tételezzük fel, hogy valóban egy Array-t kapsz a háttérrendszeredtől, akkor egyszerűen az Array-t kellene használnod így ahelyett, hogy a saját UpdateMediaList definíciódat használnád:
export type UpdateMediaList = Array<ContactResponse>;
vagy, egyenértékűen
export type UpdateMediaList = ContactResponse[];
Akkor, ha ezt próbálnád, hibát kapnál:
const weirdUpdateMediaList: UpdateMediaList = {0: someContactResponse};
// error! not assignable to type 'ContactResponse[]'.
// Property 'length' is missing in type '{ 0: ContactResponse; }'.
És biztonságos lenne feltételezni, hogy bármely UpdateMediaList típusú objektum egy valódi Array, minden szükséges metódussal.
Van értelme? Sok szerencsét.
