Redux-Observable - ошибка машинописного текста: «Тип свойства» отсутствует в типе «{}», но требуется в типе » - PullRequest
0 голосов
/ 22 октября 2019

Я использую наблюдаемую избыточность, и у меня есть ошибка Typescript, которую я не могу понять, и она кажется случайной, если у меня слишком много строк кода в конвейере rxjs:

Type 'Observable<{}>' is not assignable to type 'Observable<{ type: "feed/PUSH"; payload: Profile; } | { type: "feed/POP"; } | { type: "feed/SWIPE"; payload: Swipe; } | { type: "feed/FETCH_NEXT_IDS"; } | { type: "feed/PUSH_NEXT_IDS"; payload: { nextIds: string[]; nextPage: number; }; } | { ...; } | { ...; } | { ...; }>'.
  Type '{}' is not assignable to type '{ type: "feed/PUSH"; payload: Profile; } | { type: "feed/POP"; } | { type: "feed/SWIPE"; payload: Swipe; } | { type: "feed/FETCH_NEXT_IDS"; } | { type: "feed/PUSH_NEXT_IDS"; payload: { nextIds: string[]; nextPage: number; }; } | { ...; } | { ...; } | { ...; }'.
    Property 'type' is missing in type '{}' but required in type '{ type: "feed/FETCH_NEXT_PROFILE"; }'.ts(2322)
action.d.ts(36, 5): 'type' is declared here.
index.d.ts(36, 26): The expected type comes from the return type of this signature.

Вот код, в котором есть ошибка. Я добавил много tap функций в конвейер, чтобы показать тот факт, что ошибка появляется только тогда, когда у меня слишком много tap. Если я удаляю определенное число tap, ошибка, похоже, исчезает.

export const swipeEpic: Epic<RootAction, RootAction, RootState> = action$ =>
  action$.pipe(
    filter(isOfType(SWIPE)),
    tap(nextIds => {
      console.log('fetch new ids result :');
      console.log(nextIds);
    }),
    tap(nextIds => {
      console.log('fetch new ids result :');
      console.log(nextIds);
    }),
    tap(nextIds => {
      console.log('fetch new ids result :');
      console.log(nextIds);
    }),
    tap(nextIds => {
      console.log('fetch new ids result :');
      console.log(nextIds);
    }),
    tap(nextIds => {
      console.log('fetch new ids result :');
      console.log(nextIds);
    }),
    tap(nextIds => {
      console.log('fetch new ids result :');
      console.log(nextIds);
    }),
    tap(nextIds => {
      console.log('fetch new ids result :');
      console.log(nextIds);
    }),
    tap(nextIds => {
      console.log('fetch new ids result :');
      console.log(nextIds);
    }),
    map(pop)
    // map(fetchNextProfile)
  );

1 Ответ

1 голос
/ 23 октября 2019

Я подозреваю, что то, что вы видите, каким-то образом связано с тем фактом, что утилита RxJS pipe() имеет только типобезопасную поддержку для передачи 9 операций .

После того, как выЕсли вы превысите это число, то получите менее безопасную подпись, которая может стать причиной вашей проблемы. Раскрывает ли это фактическую ошибку в некоторой сигнатуре типа RxJS, Redux Observable, или ошибку в вашем коде, или это «просто так, как должно быть на самом деле», или что-то еще, я не сразу уверен --извиняюсь! Просто хотел зайти, чтобы хотя бы сообщить вам, что очень вероятно, что это связано.

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


Причина этого в RxJS заключается в том, что TypeScript (на момент написания этой статьи) не поддерживает универсальные переменные, такие как вариадические виды, хотя в течение многих лет обсуждалось это вокруг *1012*.

...