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);
