Weboldal keresés

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.

Kapcsolódó cikkek