Помилка rxjs / Subject.d.ts: Клас 'Subject <T>' неправильно розширює базовий клас 'Observable <T>'


89

Я витягнув зразок коду шаблону з цього підручника і зробив два кроки, щоб розпочати -

  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

Я бачу, що в декларації subject.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 . Нижче мій пакет.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"
  }
}



Здається, це було виправлено у rxjs@5.4.2 .

Відповіді:


70

Відповідно до цього вам потрібно оновити машинопис 2.3.4 або rxjs 6 alpha

перейдіть до файлу package.json у версію typecript або rxjs для оновлення проекту. Приклад

"typescript": "2.3.4"

робити npm install

оновлення (29.06.2017): -

Відповідно до машинопису коментарів "2.4.0"працює.


6
"typescript": "^2.3.4"буде відповідати 2.4.1 і 2.4 - це версія, яка виявляє проблему з RxJS.
їздовий

5
Замінена версія машинопису на "2.4.0" у мене спрацювала.
Аякс

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 і, отже, було виправлено у версії 5.4.2 RxJS . Тож ідеальним рішенням є просто оновлення до 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,

 }

Дякую за це, це спрацювало. Я спробував багато інших речей, але, мабуть, ця помилка пов'язана з неправильними пакетами з неправильною версією, які не підтримують один одного ...
Салім,

2
Я думаю, що це не гарна ідея вимкнути або придушити All LibCheck.
CharanRoot

Я запропонував те ж саме щодо питання github
Шон Ньюелл,

@Jonnysai, оскільки ви не володієте цим кодом, придушення перевірки lib є короткостроковим, оскільки ви можете подавати проблеми в бібліотеки, а потім продовжувати власну розробку. Ви можете подати власну проблему та посилатися на її проблему, а коли їх типи виправлять, ви можете зняти придушення.
Шон Ньюелл,

6
Справжнім рішенням не повинно бути skipLibCheck. Якщо ви робите це, ви потенційно засліплюєте інші проблеми. Краще рішення - noStrictGenericChecksпоки RxJS не оновиться.
Даніель Розенвассер,

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
Я спробував це, оскільки це здавалося найменш руйнівною справою. Працював нормально.
Stephen Holt

1
Я зрозумів, як додати файл - "import 'rxjs / Subject';" (без "від" або фігурних дужок) в app.component.ts.
Джон Панкович

1
@JaredWhipple Це серйозна проблема, яка має наслідки набагато більше, ніж перевірка друку. Ви можете використовувати "paths"in, tsconfig.jsonщоб явно вказати, де "rxjs"і що "rxjs/*"слід вирішити для перевірки типу. Однак наявність декількох версій, ймовірно, спричинить проблеми під час роботи. Навіть якщо ви не використовуєте instanceofта інші подібні тести, ваші керівники можуть бути менш принциповими. Найкраще зробити це - відкрити проблему з videogular2, де пропонується змінити RxJS на залежність від однолітків.
Алуан Хаддад

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", та "typecript": "^ 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", і я цього не змінив, все, здається, добре. Дякую за ваші дві копійки - це мені допомогло!
Том А

У мене також є ця проблема з використанням 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": істина у файлі tsconfig.json у вузлі "compilerOptions", як показано нижче в додатку image & build. Після того, як цю помилку було вирішено, я зіткнувся з такою ж помилкою. введіть тут опис зображення


2

Я знайшов ту саму проблему і вирішив її, використовуючи "rxjs": "5.4.1" , "typecript": "~ 2.4.0" та додавши "noStrictGenericChecks": true у tsconfig.json.


1

У RxJS 6 це буде виправлено, але як тимчасовий обхідний шлях ви можете скористатися noStrictGenericChecksопцією компілятора.

В tsconfig.json, вставте його compilerOptionsі встановіть його на true.

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

У командному рядку це --noStrictGenericChecks.

Чому це відбувається:

TypeScript 2.4 має сувору зміну, і тема не піднімається до правильної спостережуваної. Підпис справді повинен був бути

(оператор: Оператор) => Спостережуваний

Це буде виправлено в 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 встановити rxjs @ 6 rxjs-compat @ 6 --save


0

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

npm uninstall ionic-native --save

Це вирішить вашу проблему ..



0

дякую відповіді zmag та Rahul Sharma, це працює! @zmag @Rahul Sharma

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

-3

так, проблема була в TypeScript 2.4.1. Я щойно видалив це з панелі керування, і це працює для мене, оскільки Visual Studio 2017 це вже має.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.