Проблема печати с flatMap в угловых и rxjs 6 - PullRequest
0 голосов
/ 29 сентября 2019

Я учу rxjs в угловых. Я загрузил проект из учебника, и один класс не может скомпилироваться. Я пытался исправить это, предполагая, что какая-то библиотека эволюционировала, но мне это не удалось. Я упростил код до минимума и до сих пор не могу понять, почему я получаю ошибку. Это ошибка машинописного текста, передаваемая через Intellij IDE.

Я получаю сообщение об ошибке в строке 7 ниже:

import { flatMap, map } from 'rxjs/operators';
import { Observable, of } from 'rxjs';

export class TestClass {
    a$ = of('dummy').pipe( // Observable<string>
        flatMap(s => of(s)), // Observable<string>
        map<string, string>(s => s) // Observable<string>  <-- ERROR HERE
    );

    b$ = of('dummy').pipe( // Observable<string>
        flatMap(s => of(s)), // Observable<string> or Observable<Observable<string>> ?
        map<Observable<string>, Observable<string>>(os => os)
    );
}

map() просто посмотреть, какой тип ожидается после flatMap().

Насколько я понимаю flatMap, у вас есть Observable<T> на входе, вы отображаете каждый элемент T на Observable<T>, а flatMap выравнивает всю спину до Observable<T>.

Но в $ есть ошибка. enter image description here

Пока b $ компилируется нормально. Кажется, что flatMap не выравнивает содержимое и выдает Observable<Observable<T>>. Следующая map() ожидает Observable<T> как элементы.

Так что же происходит? Есть ли что-то, чего я не понял в flatMap() или pipe()? Или что-то смешное происходит с моим компилятором или моей IDE, и я получаю ошибочные сообщения об ошибках?

Обновление

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

Ответы [ 2 ]

0 голосов
/ 01 октября 2019

Я решил свою проблему.

Мое понимание flatMap правильное, а tslint неверно.

После обновления версии машинописного текста и tslint (и нескольких других), a$ скомпилировано нормально, а b$ приводит к ошибке, как я и ожидал.

Кажется, есть какая-то проблема с версией tslint, которую я использовал, или, возможно, проблема совместимости с другими библиотеками, которая привела кложная ошибка.

Для записи не работающая конфигурация включала:

"@angular-devkit/build-angular": "~0.6.8",
"@angular/...": "^6.0.3",
"rxjs": "^6.0.0",
"ts-node": "~5.0.1",
"typescript": "~2.7.2",
"tslint": "~5.9.1"

Работающая конфигурация включает:

"@angular-devkit/build-angular": "^0.13.0",
"@angular/...": "^6.1.3",
"rxjs": "6.0.0",
"ts-node": "~7.0.1",
"typescript": "~2.7.0"
"tslint": "~5.11.0",
0 голосов
/ 29 сентября 2019

of('dummy') создает Observable и испускает строку 'dummy' по трубе.
flatMap (согласно документам здесь это псевдоним для mergeMap), получит то, чтопредыдущий оператор / статический метод, отправленный по каналу, сопоставьте его с тем, что вы указали в функции проектора, а затем сгладьте его, объединив с внешним Observable (согласно документам здесь ).

В вашемВ случае flatMap(s => of(s)) строка 'dummy' будет отображена в Observable, а перед возвращением и отправкой по каналу flatMap объединит ее с внешним Observable, поэтому у вас нет Observable<Observable<string>> иожидается, что простые Observable<string>.

операторы RxJs получат Observables и вернут Observables по конвейеру (если один из них, например map, не возвращает явно Observable, RxJ сделает это за вас зашторы). Таким образом, ваш последний map получит Observable<string>, как ожидалось в b$, а не просто string, как ожидалось в a$.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...