javascript - typescript - strängliteraltyp till typsträng


Jag har en metod med strängliteralt typvakt

type Status = 'new' | 'update' | 'close';

itemRequest(status: Status) { 
    itemService.subscribeToChanges(status) //third party library method
}

Svårigheten jag har är att denna tredje parts metod accepterar en sträng, inte min anpassade strängtyp Status

subscribeToChanges(status: string) 

Hur kan jag se till att mina strängliteral verkligen är typer av strängar och när jag skickar dem till en tredjepartsmetod. Det förstår att det faktiskt är en sträng?

Svar #1

Du kan kasta ditt värde av Status till en sträng på följande sätt:

type Status = 'new' | 'update' | 'close';

itemRequest(status: Status) { 
    itemService.subscribeToChanges(status as string)
}

Använd inte String(status). Detta skapar ett nytt string-objekt från status och är en slösaktig allokering. Typomvandlingen kommer att tas bort vid körning och korrigerar bara TypeScripts kunskap om typen på status-variabeln. Kom ihåg att all typkontroll som TypeScript gör sker vid kompilering och har ingen kostnad eller närvaro vid körning.

Den här koden kommer att kompileras till följande:

itemRequest(status) {
  itemService.subscribeToChanges(status)
}

Jag är dock förvirrad över varför detta händer. Dina typalias är alla av typen string så att kasta från Status till string borde vara en upptypning (dvs, tillåten under vilken rimlig typkontroll som helst). Den andra vägen skulle vara det största problemet. Faktiskt fungerar din ursprungliga kod alldeles utmärkt på egen hand.

Svar #2

Kan du göra Status till en enum? Då kan du använda Status[status] vilket kommer att vara det strängvärde du förväntar dig. d.v.s.

enum Status { new, update, close }

itemRequest(status: Status) { 
    itemService.subscribeToChanges(Status[status]) //third party library method
}

Relaterade artiklar