typescript - Angular gränssnittsnamn rörigt


Jag arbetar med ett API som har olika fält för samma enhet beroende på kontext. Till exempel, om jag får en lista med enheter får jag bara hälften av fälten och när jag får en specifik enhet med id får jag den fullständig. Dessutom, när jag behöver skicka denna enhet till servern (skapa en ny) måste jag skicka en annan uppsättning fält.

Det är olämpligt att använda den valfria ?-tecknet i gränssnittet för fält eftersom för "getList" kommer dessa fält aldrig att komma och därför bör jag inte vilseleda med gränssnittet och så vidare i andra fall.

Som ett resultat har jag ungefär 3-4 gränssnitt (det första för att spara, det andra för getList, det tredje för getById, det fjärde för denna enhet som en del av en annan enhet och så vidare) för samma enhet. Enligt Angulars tslint-regler är det inte lämpligt att använda namespaces (vilket jag tänkte använda).

Hur strukturerar jag alla mina gränssnitt på ett sätt som är naturligt att förstå och bra för underhåll?

För tillfället kan jag tänka mig BaseEntityInterface som kan vara kärnan med alla vanliga alltid närvarande fält.

Då ListEntityInterface extends BaseEntityInterface som skulle ha ytterligare egenskaper och så vidare. Detta leder dock till ologiskt långa namn.

För dem som vill säga att det inte rekommenderas att använda interface-suffix eller I-prefix vill jag nämna att detta är ett steg på grund av klasser som kan finnas för dessa enheter (de har egna metoder som bara används i deras egna kontext och när enheter skickas till någon metod är de vanligtvis inte instans av denna klass).

Uppdatering #1

Till exempel har vi en anställd-entitet.

Basgränssnittet (det som vi kan återanvända i alla gränssnitt) skulle se ut som

export interface BaseEmployeeInterface {
  id: string;
  name: string;
  age: number;
  gender: string;
}

Nu när man försöker få getEmployee(id)

export interface GetEmployeeResponse extends BaseEmployeeInterface {
  startDate: string;
  status: string;
  salary: number;
  extra: ExtraDataFull; // some large object
}

Men om man får tillgång till getEmployeeList får man GetEmployeeListResponse[]

export interface GetEmployeeListResponse extends GetEmployeeResponse {
  extra: ExtraDataShort; // some essential parts of a large object data
  // and some other props
}

Nu, om man öppnar getGuestList får de GetGuestList[]

export interface GetGuestList {
  name: string;
  items: ItemList[];
  ref: Omit<GetEmployeeListResponse, ...>; // All but some props
}

Och nu finns det åtminstone 4 varianter av Employee-enhetsdata som mottagits och det är inte begränsat till detta antal. Om jag behöver deklarera ett gränssnitt för att skapa Employee-enhet skulle det finnas ett femte fall av typen.

Här när jag använder ref: Omit<GetEmployeeListResponse, ...> behöver jag komma ihåg denna typdeklaration eller skapa en annan typ för att återanvända detta gränssnitt.

Jag vill också nämna att detta fall är mycket förenklat eftersom i min applikation är gränssnittet ungefär fem gånger större.

P.S. Det finns minst två andra entitetsändpunkter som inkluderar vissa delar av Employee-entitetsdata och detta är 4 till (för varje ändpunkt 1 för lista och 1 för get*(id))