Ошибка rxjs / Subject.d.ts: класс Subject <T> неправильно расширяет базовый класс Observable <T>

90

Я извлек образец кода шаблона из этого руководства и сделал два следующих шага, чтобы начать работу:

  1. npm install // worked fine and created node_modules folder with all dependencies
  2. npm start // не удалось с ошибкой ниже -

    node_modules/rxjs/Subject.d.ts(16,22): error TS2415: Class 'Subject<T>' 
      incorrectly extends base class 'Observable<T>'.
      Types of property 'lift' are incompatible.
      Type '<T, R>(operator: Operator<T, R>) => Observable<T>' is not assignable  
      to type '<R>(operator: Operator<T, R>) => Observable<R>'.
      Type 'Observable<T>' is not assignable to type 'Observable<R>'.
      Type 'T' is not assignable to type 'R'.
      npm ERR! code ELIFECYCLE
      npm ERR! errno 2
    

Я вижу, что в теме.d.ts объявление подъема выглядит следующим образом:

 lift<T, R>(operator: Operator<T, R>): Observable<T>;

И в Observable.ts он определяется следующим образом:

 lift<R>(operator: Operator<T, R>): Observable<R> {

Примечание: - 1. Я новичок в Angular2 и пытаюсь разобраться во всем.

  1. Ошибка может быть связана с несовместимыми определениями метода подъема.

  2. Я прочитал эту ветку на github

  3. Если мне нужно установить другую версию rxjs, расскажите, пожалуйста, как удалить и установить правильный rxjs.

Edit1: Возможно, я немного запоздал с ответом здесь, но я все равно получаю ту же ошибку даже после использования машинописного текста 2.3.4 или rxjs 6 alpha . Ниже мой package.json,

{
  "name": "angular-quickstart",
  "version": "1.0.0",
  "scripts": {
    "start": "tsc && concurrently \"npm run tsc:w\" \"npm run lite\" ",
    "lite": "lite-server",
    "postinstall": "typings install",
    "tsc": "tsc",
    "tsc:w": "tsc -w",
    "typings": "typings"
  },
  "license": "ISC",
  "dependencies": {
    "@angular/common": "2.0.0",
    "@angular/compiler": "2.0.0",
    "@angular/core": "2.0.0",
    "@angular/forms": "2.0.0",
    "@angular/http": "2.0.0",
    "@angular/platform-browser": "2.0.0",
    "@angular/platform-browser-dynamic": "2.0.0",
    "@angular/router": "3.0.0",
    "@angular/upgrade": "2.0.0",
    "core-js": "^2.4.1",
    "reflect-metadata": "^0.1.3",
    "rxjs": "6.0.0-alpha.0",
    "systemjs": "0.19.27",
    "zone.js": "^0.6.23",
    "angular2-in-memory-web-api": "0.0.20",
    "bootstrap": "^3.3.6"
  },
  "devDependencies": {
    "concurrently": "^2.2.0",
    "lite-server": "^2.2.2",
    "typescript": "2.3.4",
    "typings": "^1.3.2"
  }
}
Deepak S
источник
Похоже, это было исправлено в rxjs@5.4.2 .

Ответы:

70

В соответствии с этим вам нужно обновить typescript 2.3.4 или rxjs 6 alpha

перейдите к файлу package.json в вашем проекте, обновите typescript или версию rxjs. пример

"typescript": "2.3.4"

делать npm install

обновление (29.06.2017): -

Согласно "2.4.0"работам машинописного текста комментариев .

CharanRoot
источник
6
"typescript": "^2.3.4"будет соответствовать 2.4.1, а 2.4 - это версия, в которой обнаружена проблема с RxJS.
cartant
5
Замененная версия машинописного текста на "2.4.0" у меня сработала.
Ajhar Shaikh
1
Во-вторых, это должно быть именно «2.3.4» - «^ 2.3.4» у меня не сработало.
maia
1
комбинация "typescript": "2.3.0"и "rxjs": "5.4.1"сработала для меня
ericdemo07
@Jonnysai, прости, я беру то, что сказал. Проект скомпилирован, но я получил ошибку во время выполнения и перешел на 2.3.4. Подробнее здесь: stackoverflow.com/a/44556137
Carcamano
25

Как отмечали другие, эта проблема возникла в результате более строгой проверки типов универсальных шаблонов, представленных в TypeScript 2.4. Это выявило несоответствие в определении типа RxJS и, следовательно, было исправлено в версии RxJS 5.4.2 . Итак, идеальное решение - просто перейти на версию 5.4.2.

Если вы по какой-то причине не можете выполнить обновление до 5.4.2, вам следует вместо этого использовать решение Алана Хаддада по расширению объявления типа, чтобы исправить это для вашего собственного проекта. Т.е. добавьте этот фрагмент в свое приложение:

// TODO: Remove this when RxJS releases a stable version with a correct declaration of `Subject`.
import { Operator } from 'rxjs/Operator';
import { Observable } from 'rxjs/Observable';

declare module 'rxjs/Subject' {
  interface Subject<T> {
    lift<R>(operator: Operator<T, R>): Observable<R>;
  }
}

Его раствор не оставит никаких других побочных эффектов и, таким образом, великолепен. Альтернативно предлагаемые решения имеют больше побочных эффектов для настройки вашего проекта и поэтому менее идеальны:

  • отключите более строгие общие проверки с помощью флага компилятора --noStrictGenericChecks. Однако это сделает его менее строгим для вашего собственного приложения, что вы можете сделать, но может привести к несогласованным определениям типов, как это было в этом экземпляре RxJS, что, в свою очередь, может привести к большему количеству ошибок в вашем приложении.
  • Не проверять типы в библиотеках с флагом --skipLibCheck, установленным в true. Это тоже не идеально, так как вы можете не получать сообщения об ошибках типа.
  • Обновление до RxJS 6 Alpha - учитывая, что есть критические изменения, это может сломать ваше приложение плохо задокументированным образом, поскольку оно все еще находится в альфа-версии. Кроме того, если у вас есть другие зависимости, такие как Angular 2+, это может быть не поддерживаемый вариант, нарушающий сам фреймворк сейчас или в будущем. Я думаю, что решить эту проблему еще сложнее.
Кослун
источник
24

Допустимый подход к лечению заключается в добавлении следующего в ваш файл tsconfig.json до тех пор, пока сотрудники RxJS не решат, что они хотят делать с ошибкой при использовании TypeScript 2.4.1:

"compilerOptions": {

    "skipLibCheck": true,

 }
user3785010
источник
Спасибо за это, сработало. Я пробовал много других вещей, но думаю, что эта ошибка связана с неправильными пакетами, неправильная версия которых не поддерживает друг друга ...
Салим
2
Я думаю, что отключать или подавлять All LibCheck - не лучшая идея.
CharanRoot
Я предложил то же самое по проблеме
Шон Ньюэлл
@Jonnysai, поскольку вы не владеете этим кодом, подавление проверки библиотеки в краткосрочной перспективе нормально, поскольку вы можете сообщить о проблемах с библиотеками, а затем продолжить свою собственную разработку. Вы можете указать свою проблему и указать ссылку на ее проблему, а когда их типы будут исправлены, вы сможете отключить подавление.
Шон Ньюэлл
6
Настоящим решением не должно быть skipLibCheck. Если вы делаете это, вы потенциально можете упускать из виду другие проблемы. Лучшее решение - noStrictGenericChecksдо обновления RxJS.
Daniel
19

Вы можете временно обойти проблему, используя расширение модуля

Следующий код решил проблему для меня. Как только у RxJS будет стабильная версия, в которой не будет этой проблемы, ее следует удалить.

// augmentations.ts
import {Operator} from 'rxjs/Operator';
import {Observable} from 'rxjs/Observable';

// TODO: Remove this when a stable release of RxJS without the bug is available.
declare module 'rxjs/Subject' {
  interface Subject<T> {
    lift<R>(operator: Operator<T, R>): Observable<R>;
  }
}

Хотя, возможно, иронично, что сам RxJS так интенсивно использует эту технику для описания своей собственной формы, на самом деле она обычно применима к множеству проблем.

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

Алуан Хаддад
источник
куда вы добавляете или импортируете этот файл?
Дэйв
1
добавьте его в любом месте вашего проекта, чтобы компилятор принял его. Если вы используете явные списки файлов, убедитесь, что они включены. В противном случае он должен быть получен автоматически, если он не находится над файлом tsconfig.json
Алуан Хаддад
2
Я попробовал это, так как это казалось наименее разрушительным занятием. Работал нормально.
Стивен Холт
1
Я придумал, как добавить файл - «import 'rxjs / Subject';» (без "от" и фигурных скобок) в app.component.ts.
Джон Панкович
1
@JaredWhipple Это серьезная проблема, которая имеет значение не только для проверки типов. Вы можете использовать "paths"in, tsconfig.jsonчтобы явно указать, где "rxjs"и "rxjs/*"должно разрешаться для проверки типов. Однако наличие нескольких версий может вызвать проблемы во время выполнения. Даже если вы не будете использовать instanceofи другие подобные тесты, ваши исследования могут быть менее принципиальными. Лучше всего открыть проблему с videogular2, предлагающую изменить RxJS на одноранговую зависимость.
Aluan Haddad
9
"dependencies": {
"@angular/animations": "^4.3.1",
"@angular/common": "^4.3.1",
"@angular/compiler": "^4.3.1",
"@angular/compiler-cli": "^4.3.1",
"@angular/core": "^4.3.1",
"@angular/forms": "^4.3.1",
"@angular/http": "^4.3.1",
"@angular/platform-browser": "^4.3.1",
"@angular/platform-browser-dynamic": "^4.3.1",
"@angular/platform-server": "^4.3.1",
"@angular/router": "^4.3.1",
"core-js": "^2.4.1",
"rxjs": "^5.4.2",
"ts-helpers": "^1.1.1",
"zone.js": "^0.7.2"
},
"devDependencies": {
"@angular/compiler-cli": "^2.3.1",
"@types/jasmine": "2.5.38",
"@types/node": "^6.0.42",
"angular-cli": "1.0.0-beta.28.3",
"codelyzer": "~2.0.0-beta.1",
"jasmine-core": "2.5.2",
"jasmine-spec-reporter": "2.5.0",
"karma": "1.2.0",
"karma-chrome-launcher": "^2.0.0",
"karma-cli": "^1.0.1",
"karma-jasmine": "^1.0.2",
"karma-remap-istanbul": "^0.2.1",
"protractor": "~4.0.13",
"ts-node": "1.2.1",
"tslint": "^4.3.0",
"typescript": "^2.3.4",
"typings": "^1.3.2"
}

в package.json "rxjs": "^5.4.2", и "typescript": "^ 2.3.4", затем npm install и ng обслуживают его работу.

Кетан Чаудхари
источник
8

Просто немного деталей, чтобы попытаться вложить в мои два цента.

Проблема возникает, когда мы обновляем Typescript до последней версии, которая на данный момент была TypeScript 2.4.1 , ["так как мы любим обновления :) "], и, как отметил @ Jonnysai в своем ответе и приведенной там ссылке, есть подробное обсуждение проблемы и ее исправлений.

Итак, что работал для меня:
1. Я должен был Un установить машинопись 2.4.1 первых, перейдя в Панель управления > Программы и компоненты ...
2. Установить, заново, машинопись 2.4.0 , а затем убедитесь в package.jsonфайл, у вас есть эта конфигурация, как упоминалось здесь в более короткой детали. Вы можете скачать машинопись 2.4.0 от сюда , для Visual Studio 2015

введите описание изображения здесь


Ирфан
источник
Это работало очень просто, без «обходных путей». Я не уверен, что это имеет значение, но мой rxjs был "5.0.1", и я не менял его, хотя все выглядит нормально. Спасибо за ваши два цента - мне это помогло!
Tom A
У меня также есть эта проблема с использованием Typescript 2.3.4. Так что кажется неправильным, что проблема возникает из-за обновления до 2.4.1. Текущий angular-cli устанавливает 2.3.4, потому что он говорит, что для него требуется <2.4.0.
Джон Панкович
5

Вы можете временно использовать этот --noStrictGenericChecksфлаг, чтобы обойти это в TypeScript 2.4.

Это --noStrictGenericChecksв командной строке или просто "noStrictGenericChecks": trueв "compilerOptions"поле в tsconfig.json.

Имейте в виду, что RxJS 6 исправит это.

См. Аналогичный вопрос: как обойти эту ошибку в RxJS 5.x в TypeScript 2.4?

Даниэль Розенвассер
источник
где вы ставите флаг?
Дэйв
3

Измените следующую строку Subject.d.tsфайла:

lift<R>(operator: Operator<T, R>): Observable<T>;

кому:

lift<R>(operator: Operator<T, R>): Observable<R>;

Тип возврата, вероятно, должен быть, Observable<R>а неObservable<T>

Массимилиано Краус
источник
3

Оставьте параметр noStrictGeneric истинным в файле tsconfig.config

{
    "compilerOptions": {
        "noStrictGenericChecks": true
    }
}
Джигар Танна
источник
3

Добавьте «noStrictGenericChecks»: true в файл tsconfig.json в узел «compilerOptions», как показано на изображении и приложении сборки ниже. Я столкнулся с такой же ошибкой после добавления этой ошибки. введите описание изображения здесь

Акшай Баги
источник
2

Я обнаружил ту же проблему и решил ее, используя «rxjs»: «5.4.1» , «typescript»: «~ 2.4.0» и добавив «noStrictGenericChecks»: true в tsconfig.json.

Хачорнчит Сонгсаен
источник
1

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

В tsconfig.json, положить его в compilerOptionsи установить его в действительности.

{
    "compilerOptions": {
        "noStrictGenericChecks": true
    }
}

В командной строке это --noStrictGenericChecks.

Почему это происходит:

TypeScript 2.4 имеет изменение строгости, и Subject не поднимается до правильного Observable. Подпись действительно должна была быть

(оператор: оператор) => наблюдаемый

Это будет исправлено в RxJS 6.

Суреш Медибойна
источник
1

Перейдите в файл Package.json и измените конфигурацию ниже.

...
  "rxjs": "5.4.1",
  "typescript": "~2.4.0"
...

Это сработает

Рахул Шарма
источник
0

Однако использование только вышеуказанного не помогло, используя следующий подход: Как мне обойти эту ошибку «Субъект неправильно расширяет наблюдаемый» в TypeScript 2.4 и RxJs 5

решил проблемы. Там также упоминается, что проблема была исправлена ​​в RxJs 6, так что это скорее временное исправление, которое помогло мне успешно запустить этот замечательный пример (который ранее скомпилировался, но давал ошибку во время загрузки): Разработка приложения Angular 4 с Bootstrap 4 и TypeScript

Гиль Шапир
источник
0

переустановка rxjs -> npm install rxjs @ 6 rxjs-compat @ 6 --save

Якуп Ад
источник
0

Теперь нам не нужен модуль ionic-native - нам нужен только @ ionic-native / core. Бежать

npm uninstall ionic-native --save

Это решит вашу проблему ..

Шубхам Панди
источник
0

просто добавь

"noStrictGenericChecks": true

в ваш tsconfig.json

Мигель Афонсу
источник
0

спасибо за ответ zmag и Рахул Шарма, все работает! @zmag @ Рахул Шарма

  "rxjs": "5.4.1",
  "typescript": "~2.4.0"

моя проблема заключается в следующем:

typings/globals/core-js/index.d.ts:3:14 - error TS2300: Duplicate identifier

Внесите изменения как.

Перейдите в файл Package.json и измените конфигурацию ниже.

  "rxjs": "5.4.1",
  "typescript": "~2.4.0"
SageX
источник
-3

да, проблема была с TypeScript 2.4.1. Я только что удалил его из панели управления, и он работает для меня, поскольку в Visual Studio 2017 он уже есть.

Субхаш Шарма
источник