rxjs - Varför tillåter inte Typescript att BehaviorSubject tar en unionstyp?


Jag tror att detta problem är helt relaterat till Typescript, och råkar bara involvera BehaviorSubject i mitt fall.

Jag vet att båda dessa rader:

    const myVariable: string | null = 'string';

och

    const myVariable: string | null = null;

är giltig syntax. Så i samma anda har jag deklarerat denna BehavoirSubject:

    const user: BehaviorSubject<User | null> = new BehaviorSubject(
      null
    );

Det här fungerar inte, på grund av detta fel:

Type 'BehaviorSubject<null>' is not assignable to type 'BehaviorSubject<User | null>'.
  Types of property 'observers' are incompatible.
    Type 'Observer<null>[]' is not assignable to type 'Observer<User | null>[]'.
      Type 'Observer<null>' is not assignable to type 'Observer<User | null>'.
        Type 'User | null' is not assignable to type 'null'.
          Type 'User' is not assignable to type 'null'.ts(2322)

Min förväntning är att detta BehaviorSubject i detta exempel borde ta antingen User eller null-typer, men det verkar som att det endast accepterar båda samtidigt som en enda förväntad typ, därför fungerar detta som en lösning:

const user: BehaviorSubject<User | null> = new BehaviorSubject(
    null as User | null
  );

Typerna i sig verkar inte spela någon roll, "string | null" och "User | string" ger båda samma typ av fel, så hur ska den här typen av typning faktiskt göras? Jag skulle helst slippa behöva typkonvertera någonsin.

Tack i förväg :)

Svar #1

Genom att inte ange typen i konstruktören, antas den generiska typparametern vara null, inte User | null. Typen på variabeln (const user) påverkar inte detta (tilldelningen sker efter värdekonstruktionen och utför endast en typomvandling om någon sådan finns).

Specificera uttryckligen typen av T:

const user = new BehaviorSubject<User | null>(null);

Relaterade artiklar