typescript: referera till den aktuella klassen typen


Är det möjligt att referera till aktuell klastyp i typsignaturen? så att jag kan göra något som detta:

 export class Component{
  constructor(config?: { [field in keyof self]: any }) {
      Object.assign(this, config)
  }
}

Idén är att skicka ett konfigurationsobjekt som skulle bestå av aktuella klassnycklar.

Jag skulle kunna använda gränssnitt men då behöver jag skriva samma kodavsnitt två gånger (i gränssnittet och i den implementerande klassen)

Ett annat sätt skulle vara att använda generics. Något liknande detta:

export class Component<T>{
  init(config?: { [field in keyof T]?: any }) {
    Object.assign(this, config)
  }
}

class TestComponent extends Component<TestComponent>{
  foo: number
}
const component = new TestComponent().init({ foo: 11 })

Men att ha kod som class TestComponent extends Component<TestComponent> får mig att söka efter bättre sätt...

Svar #1

Du kan referera till den aktuella klassen med polymorf this-typ

export class Component{
  init(config?: { [field in keyof this]?: this[field] }) {
    Object.assign(this, config)
  }
}

class TestComponent extends Component{
  foo: number
}
const component = new TestComponent().init({ foo: 11 })
const component2 = new TestComponent().init({ foo: "11" }) // err

Du kan dock inte använda this som en typ i konstruktorn

export class Component{
  constructor(config?: { [field in keyof this]?: this[field] }) { // error
    Object.assign(this, config)
  }
}

Relaterade artiklar