När man använder ett gränssnitt eller en klass i Typescript


Jag har ett enkelt scenario med en inloggning som kräver att användaren matar in en e-postadress och ett lösenord i Typescript. Jag behöver skapa en typ för att göra detta starkt typat och skicka det till backend.

Ska detta skrivas som:

export interface UserLogin {
  email: string;
  password: string;
}
//OR
export class UserLogin {
  email: string;
  password: string;
}

Och hur vet man när det är scenariot att använda någon av dessa?

Svar #1

I sin mest grundläggande form är en klass i princip en objektfabrik (dvs. en ritning över hur ett objekt ska se ut och sedan implementeras), medan ett gränssnitt är en struktur som används enbart för typkontroll.

Medan en klass kan ha initierade egenskaper och metoder för att hjälpa till att skapa objekt, definierar ett gränssnitt i princip de egenskaper och den typ ett objekt kan ha.

I scenariot du beskrev skulle man använda gränssnittet för att sätta typen för UserLogin.

Svar #2

Om du bara behöver deklarera en egen typ, använd då gränssnitt. Enligt min åsikt finns det en mycket pragmatisk anledning - de transpileras inte till JavaScript, så den genererade koden blir kortare.

Gränssnitt fungerar inte om du behöver instansiera objekt med konstruktörer eller använda ett ramverk som instansierar och injicerar dem. Använd då klasser eller abstrakta klasser.

Svar #3

Faktiskt kommer båda att göra jobbet. Jag skulle dock föreslå att du använder gränssnitt om du bara gör typkontroll eftersom det är speciellt utformat för det ändamålet.

Klasser och gränssnitt är kraftfulla strukturer som underlättar inte bara objektorienterad programmering utan också typkontroll i TypeScript. En klass är en mall från vilken vi kan skapa objekt som delar samma konfiguration - egenskaper och metoder. Ett gränssnitt är en grupp av relaterade egenskaper och metoder som beskriver ett objekt, men som varken tillhandahåller implementation eller initialisering för dem.

Från: https://toddmotto.com/classes-vs-interfaces-in-typescript

Svar #4

skicka det till back-end

Att skicka klasser över nätverket kräver extra ansträngning - om du använder JSON som innehållstyp kommer din klass att komma som ett vanligt objekt till din backend-kod. Se de många svaren på denna fråga som berättar hur man konverterar JSON tillbaka till ett klassobjekt så att det är möjligt att anropa dess metoder.

Men eftersom klassen i din fråga inte har några metoder, spelar det ingen roll, såvida inte back-end-koden utför körningstidkontroller med hjälp av instanceof.

För att undvika dessa problem, använd ett gränssnitt som bara har datamedlemmar för att representera objekt för kommunikation med back-end.

Relaterade artiklar