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

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

  1. npm install//worked fine and created node_modules folder with all dependencies
  2. npm start//потерпел неудачу с ниже error-

    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
    

Я вижу, что в файле subject.d.ts объявление о лифте выглядит так:

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

И в Observable.ts это определяется как below-

 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"
  }
}

Ответ 1

По this вам нужно обновить typescript 2.3.4 или rxjs 6 alpha

перейдите в файл package.json в обновлении проекта typescript или rxjs. Пример

"typescript": "2.3.4"

do npm install

обновление (06/29/2017): -

В соответствии с комментариями typescript "2.4.0".

Ответ 2

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

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

// 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+, это может быть не совсем поддерживаемый вариант, нарушающий сам фрейм сейчас или вниз по линии. Я думаю, что это еще труднее решить.

Ответ 3

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

"compilerOptions": {

    "skipLibCheck": true,

 }

Ответ 4

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

Следующий код разрешил проблему для меня. После того, как 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 настолько сильно использует этот метод для описания своей собственной формы, он в действительности применим к множеству проблем.

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

Ответ 5

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

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

Итак, что для меня работало:
1. Сначала мне пришлось Un установить Typescript 2.4.1, перейдя в Панель управления > Программы и компоненты...
2. Установите, заново, TypeScript 2.4.0, а затем убедитесь, что в package.json, у вас есть это

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

 Вы можете скачать Typescript 2.4.0 из здесь, для Visual Studio 2015

Ответ 6

"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 обслуживает свою работу.

Ответ 7

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

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

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

Смотрите этот похожий вопрос: Как обойти эту ошибку в RxJS 5.x в TypeScript 2.4?

Ответ 8

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

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

в

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

Возвращаемый тип должен быть Observable<R>, а не Observable<T>

Ответ 9

Сохранять параметр noStrictGeneric true в файле tsconfig.config

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

Ответ 10

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

Ответ 11

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

Ответ 12

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

В tsconfig.json поместите его в compilerOptions и установите для него значение true.

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

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

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

TypeScript 2.4 имеет изменение строгости, и Субъект не поднимается до правильного Наблюдаемого. Подпись действительно должна была быть

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

Это будет зафиксировано в RxJS 6.

Ответ 13

Использование вышеописанного не помогло, однако, использовать следующий подход: Как мне обойти эту ошибку "Subject неправильно расширяет Observable" в TypeScript 2.4 и RxJs 5

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

Ответ 14

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

Ответ 15

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

npm uninstall ionic-native --save

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

Ответ 16

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

"noStrictGenericChecks": true

на ваш tsconfig.json

Ответ 17

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