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

84

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

  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 комментарий
Теги:
angular
rxjs

16 ответов

69

По 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".

  • 6
    "typescript": "^2.3.4" будет соответствовать 2.4.1, а версия 2.4 представляет проблему с RxJS.
  • 5
    Замененная версия машинописи на "2.4.0" работала у меня.
Показать ещё 8 комментариев
25

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

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

"compilerOptions": {

    "skipLibCheck": true,

 }
  • 0
    Спасибо за это, это сработало. Я пробовал много других вещей, но я думаю, что эта ошибка связана с неправильными пакетами с неправильной версией не поддерживает друг друга ...
  • 2
    Я думаю, что это не очень хорошая идея, чтобы отключить или подавить All LibCheck.
Показать ещё 4 комментария
19

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

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

  • 0
    где вы добавляете или импортируете этот файл?
  • 1
    добавьте его в любое место вашего проекта так, чтобы он был подобран компилятором. Если вы используете явные списки файлов, убедитесь, что они включены. В противном случае он должен быть выбран автоматически, если он не находится над файлом tsconfig.json.
Показать ещё 13 комментариев
8
"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

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

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

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

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

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

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

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

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

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

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

  • 0
    куда ты поставил флаг?
  • 0
    офигенно, плохо добавлю это в наш tsconfig. Спасибо!
3

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

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

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

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

в

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

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

2

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

2

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

1

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

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

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

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

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

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

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

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

0

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

npm uninstall ionic-native --save

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

0

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

0

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

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

-4

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню