angular - Å sende typer som verdier i typescript


Jeg vil sende grensesnitt som verdier til et konfigurasjonsobjekt:

export interface RouterConfig {
  startEvents?: typeof RouterEvent[];
  completeEvents?: typeof RouterEvent[];
}

Bruken bør være som:

private config: RouterConfig = {
  startEvents: [NavigationStart],
  completeEvents: [NavigationEnd, NavigationCancel, NavigationError]
};

Men det kaster en feil:

Typer av egenskapen 'completeEvents' er inkompatible. Type '(typeof NavigationEnd | typeof NavigationCancel | typeof NavigationError)[]' kan ikke tildeles typen 'RouterEvent[]'. Type 'typeof NavigationEnd | typeof NavigationCancel | typeof NavigationError' kan ikke tildeles typen 'RouterEvent'. Type 'typeof NavigationEnd' kan ikke tildeles typen 'RouterEvent'. Egenskapen 'id' mangler i typen 'typeof NavigationEnd'.

Hvordan kan jeg fikse det?

Her er en stackblitz-reproduksjon

Merk at RouterEvent er en klasse

Svar #1

Klassene NavigationEnd, NavigationCancel, NavigationError har alle konstruktører med argumenter. Typen RouterEvent har en konstruktør uten argumenter. Dette er grunnen til at tildelingen mislykkes. Hvis du vil bruke en konstruktør med et hvilket som helst antall argumenter, må du bruke en konstruktørsignatur som reflekterer dette, for eksempel vil dette fungere new (...args: any[]) => RouterEvent. Angular definerer allerede en typealias for denne konstruktøren i form av typen Type. Så vi kan skrive det slik:

import { Component, Type } from '@angular/core';
import { RouterEvent, NavigationStart, NavigationEnd, NavigationCancel, NavigationError } from '@angular/router';

export interface RouterConfig {
  startEvents?: Type<RouterEvent>[];
  completeEvents?: Type<RouterEvent>[];
}
let config: RouterConfig = {
  startEvents: [NavigationStart],
  completeEvents: [NavigationEnd, NavigationCancel, NavigationError]
};

Relaterte artikler