Gostaria de ocultar a interface "next" de um BehaviorSubject, mantendo suas outras propriedades, especialmente a possibilidade de obter o último valor emitido imperativamente. A ideia é que toda manipulação de estado possa ser feita em um BehaviorSubject privado dentro de um serviço, e tudo o que eu exponho é o que eu chamaria de "ReadonlySubject" que não possui o método "next". A única ideia que tenho até agora é algo assim:
export class ReadonlyBehaviorSubject<T> extends BehaviorSubject<T> {
override next(_value: T) {
console.error('cannot set value on a readonly BehaviorSubject');
}
}
export function toReadonlyBehaviorSubject<T>(bs: BehaviorSubject<T>): ReadonlyBehaviorSubject<T> {
return new ReadonlyBehaviorSubject(bs.value);
}
Como você pode ver, ainda temos o método "next" — ele simplesmente não faz nada, apenas informa ao usuário que ele não pode definir um valor em ReadonlyBehaviorSubject. Existe algo mais organizado? De preferência, não expor o método "next" de forma alguma?
Você está apenas sobrescrevendo o método next, então ele ainda está disponível. A maneira correta seria omitir "next". Crie um tipo em vez disso:
Então use assim:
Mas, como mencionado nos comentários, o que costumo fazer é deixar o assunto como privado e expor um observável para assinar: