javascript - Hvordan skrive en Kotlinesque utvidelsesfunksjon i Typescript?


I Kotlin hvis jeg har et interface som dette:

interface User {
    val name: String
    val email: String
}

Jeg kan skrive en utvidelsesfunksjon som dette hvor som helst i koden:

fun User.toUserDto(): UserDto {
    TODO()
}

I Typescript hvis jeg har en lignende interface:

export default interface User {
    name: string;
    email: string;
}

Hvordan kan jeg forsterke det på en lignende måte? Er dette en beste praksis i språket? Finnes det et alternativ til dette som jeg ikke kjenner til?

Svar #1

Du kan utvide klasser slik, men det avhenger av prototype-egenskapen, og det finnes ingen User.prototype (og ingen User-verdi i det hele tatt heller).

Du kan også se denne veldig lange diskusjonen. Forklaringen på hvorfor Kotlin/C#-tilnærmingen ble avvist er her.

Svar #2

Grensesnitt i Typescript kan kun beskrive formen på data, du kan ikke lage instanser av dem eller endre dem.

For å skrive en utvidelsesfunksjon for et grensesnitt, må du implementere grensesnittet i en klasse, og legge til det du trenger på klassen.

export class SomeUserClass implements User {
  name: string;
  email: string;
  
  constructor(name, email) {
    ...
  }

  toUserDto() {
    ...
  }
}

Relaterte artikler