Как использовать TypeScript в Rx Js (BehaviourSubject) для строгой проверки типов? - PullRequest
0 голосов
/ 06 мая 2020

Я пытаюсь создать BehaviourSubject, используя Rx Js. Здесь, в этом коде

import { BehaviourSubject } from 'rxjs';

const name = new BehaviourSubject("Dog");

// Here in the subscribe callback, I am using TypeScript to specify the argument type should be string.
name.subscribe((name: string):void => {console.log(name)});
name.next("cat"); //cat

, я хочу ограничить эти вызовы ниже, так как мне нужно передать строку в качестве аргумента в вышеупомянутом обратном вызове подписки.

name.next(5); // This will print 5
name.next({a:5,b:{c:10}}); // This will print the object
name.next(true); // This will print true

Есть ли какие-либо способ ограничить следующие вызовы, которые не имеют действительных аргументов в обратном вызове подписки?

Ответы [ 2 ]

3 голосов
/ 06 мая 2020

Если вы посмотрите на определение типа BehaviorSubject , обратите внимание, что класс принимает параметр типа generi c (т.е. BehaviorSubject<T>).

В вашем примере вы можете указать, что внутреннее значение имеет тип string, создав параметризованную версию BehaviorSubject, а именно:

const name = new BehaviorSubject<string>("Dog");

При этом вы должны применить проверку типов к последующим использование next() и subscribe().

1 голос
/ 06 мая 2020

Вы можете создать псевдоним типа для своего BehaviourSubject, поскольку он принимает параметр типа как часть generi c.

interface NameSubjectObj {
  a: number;
  b: {
    c: number 
  }
}

type NameSubject = string | boolean | NameSubjectObj;

const name = new BehaviourSubject<NameSubject>("Dog");

Это гарантирует, что приведенный выше BehaviourSubject примет те 3 типа, которые указаны.

...