Я извлек образец кода шаблона из этого урока и сделал два шага, чтобы начать -
npm install//worked fine and created node_modules folder with all dependencies
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 и пытаюсь овладеть вещами.
Ошибка может быть связана с несовместимыми определениями метода лифта
Я прочитал эту ветку github
Если мне нужно установить какую-то другую версию 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"
}
}
По 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"
.
"typescript": "^2.3.4"
будет соответствовать 2.4.1, а версия 2.4 представляет проблему с RxJS.
Как отмечали другие, этот вопрос возник из-за более строгой проверки типов дженериков, введенных в 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, что, в свою очередь, может привести к появлению большего количества ошибок в вашем приложении.Принятый метод групповой помощи заключается в добавлении следующего в ваш файл tsconfig.json, пока люди RxJS не решают, что они хотят делать с ошибкой при использовании TypeScript 2.4.1:
"compilerOptions": {
"skipLibCheck": true,
}
Вы можете временно решить проблему, используя 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 настолько сильно использует этот метод для описания своей собственной формы, он в действительности применим к множеству проблем.
Несмотря на то, что существуют определенные ограничения и грубые грани, часть того, что делает этот метод мощным, заключается в том, что мы можем использовать его для улучшения существующих объявлений, делая их более безопасными типа без наложения и поддержки всего файла.
"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 обслуживает свою работу.
Просто немного деталей, пытаясь вставить мои два цента.
Проблема возникает, когда мы обновляем 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
Вы можете временно использовать флаг --noStrictGenericChecks
, чтобы обойти это в TypeScript 2.4.
Это --noStrictGenericChecks
в командной строке или просто "noStrictGenericChecks": true
в поле "compilerOptions"
в tsconfig.json
.
Имейте в виду, что RxJS 6 будет исправлен.
Смотрите этот похожий вопрос: Как обойти эту ошибку в RxJS 5.x в TypeScript 2.4?
Сохранять параметр noStrictGeneric true в файле tsconfig.config
{
"compilerOptions": {
"noStrictGenericChecks": true
}
}
Измените следующую строку файла Subject.d.ts
:
lift<R>(operator: Operator<T, R>): Observable<T>;
в
lift<R>(operator: Operator<T, R>): Observable<R>;
Возвращаемый тип должен быть Observable<R>
, а не Observable<T>
Добавьте "noStrictGenericChecks": true в файл tsconfig.json под узлом "compilerOptions", как показано на рисунке ниже и в приложении для сборки и сборки. Я столкнулся с той же ошибкой после добавления исправлена эта ошибка.
Я нашел ту же проблему, и решил ее с помощью "rxjs": "5.4.1" , "typescript": "~ 2.4.0" и добавив "noStrictGenericChecks": true в tsconfig.json.
RxJS 6 будет иметь это фиксированное, но как временное обходное решение, вы можете использовать опцию noStrictGenericChecks
компилятора.
В tsconfig.json
поместите его в compilerOptions
и установите для него значение true.
{
"compilerOptions": {
"noStrictGenericChecks": true
}
}
В командной строке это --noStrictGenericChecks
.
Почему это происходит:
TypeScript 2.4 имеет изменение строгости, и Субъект не поднимается до правильного Наблюдаемого. Подпись действительно должна была быть
(оператор: оператор) = > Наблюдаемый
Это будет зафиксировано в RxJS 6.
Теперь нам не нужен ионно-родной модуль - нам нужен только @ionic-native/core. Бежать
npm uninstall ionic-native --save
Это решит вашу проблему..
переустановка rxjs → npm установка rxjs @6 rxjs-compat @6 --save
Использование вышеописанного не помогло, однако, использовать следующий подход: Как мне обойти эту ошибку "Subject неправильно расширяет Observable" в TypeScript 2.4 и RxJs 5
решили проблемы. Здесь также упоминается, что проблема исправлена в RxJs 6, поэтому это скорее временное исправление, которое помогло мне успешно запустить этот замечательный пример (который был скомпилирован ранее, но дал ошибку во время загрузки): Angular 4 разработка приложений с помощью Bootstrap 4 и TypeScript
да, проблема была с TypeScript 2.4.1 Я только что удалил это из панели управления, и это работает для меня, так как Visual Studio 2017 уже имеет это.