Estoy trabajando con RXJS y Typescript en un proyecto angular. He escrito lo siguiente en mi código:
const sub = new Subject<never>();Espero que esta línea signifique que cualquier suscriptor que defina los métodos 'siguiente' y 'error', como se puede ver a continuación, nunca llamará al método 'siguiente'. Solo se llamará al método 'error', si es que se llama.
sub.subscribe(() => /*do something with 'next' value*/, error => /*do something with 'error' value*/)Sin embargo, cuando escribo lo siguiente:
sub.next();No me sale un error de compilación.
Según tengo entendido, el sujeto genérico es el tipo devuelto por el sujeto, por lo que nunca significa que nunca llamaremos al siguiente método.
¿Alguien puede explicar por qué? ¿Es esto un error, una característica o un malentendido de mi parte?
Especificar el parámetro de tipo en su Asunto restringe el tipo de valor que puede pasar cuando llama a .next() , por lo que si intenta pasar un valor: sub.next('string value') obtendrá un error:
El argumento de tipo 'cadena' no se puede asignar al parámetro de tipo 'nunca'.(2345)
Sin embargo, el parámetro de value de Subject.next() es opcional ( en RxJS v6 ). Esto significa que se permite llamar a sub.next() sin pasar un argumento, por lo que puede llamar a Subject.next con un argumento de tipo T o sin ningún argumento.
Creo que este comportamiento ha cambiado en RxJS v7. Problema interesante de GitHub
Parece que para Subject<T> el next método se define así: next(val: T | undefined): void , por lo que siempre puede pasarle undefined. Esto es diferente a BehaviorSubject , por ejemplo, donde la firma es next(val: T): void e intentar llamar a next producirá un error de tiempo de compilación.
No estoy seguro de por qué este es el caso.