javascript - Typescript-fel på unionstyp i generisk typ: 'är inte tilldelningsbar till typ'


Jag har en abstrakt klass med en generisk som jag implementerar med en unionstyp såsom:

export abstract class DAO<T> { 
  async getDocument(ref: string): Promise<T> {
        // irrelevant code that return T asynchronously
  }
}

export class ConfigurationDAO extends DAO<ConfigurationType> {
 //...
}

export type ConfigurationType = 'advertising' | 'theming';

Signaturen getDocument() för klassen ConfigurationDAO är då :

async getDocument(ref: string): Promise<ConfigurationType>

Problemet är att när jag kallar på den här funktionen får jag ett fel:

const advertisingDocument: 'advertising' = await this.getDocument('advertising');

felet :

Type 'ConfigurationType' is not assignable to type '"advertising"'.
  Type '"theming"' is not assignable to type '"advertising"'

Jag förstår inte varför typen 'advertising' inte är giltig när returtypen är 'advertising' | 'theming'

Svar #1

Typescript typiserar automatiskt ditt advertisingDocument som ConfigurationType och du försöker tvinga det till en annan typ.
Tänk på det som om det var grundläggande typer.
För Typescript gör du i princip samma sak som:

const test: number = 'name';

Eftersom 'name' är en sträng kan det inte tilldelas test som jag deklarerade som en number.

Hoppas det hjälpte.