[angular] rxjs / Subject.d.ts 오류 : ‘Subject <T>’클래스가 기본 클래스 ‘Observable <T>’를 잘못 확장합니다.
이 튜토리얼 에서 샘플 템플릿 코드를 추출 하고 시작하기 위해 아래 두 단계를 수행했습니다.
npm install // worked fine and created node_modules folder with all dependencies
-
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를 처음 접했고 사물을 파악하려고합니다.
-
리프트 방법의 호환되지 않는 정의로 인해 오류가 발생할 수 있습니다.
-
이 github 스레드를 읽었습니다.
-
다른 버전의 rxjs를 설치해야하는 경우 올바른 rxjs를 제거하고 설치하는 방법을 알려주십시오.
Edit1 :
여기서 응답하는 데 약간 늦을 수 있지만 typescript 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"
}
}
답변
당 이 당신은 2.3.4 타이프 업데이트하거나 6 알파 rxjs 필요
프로젝트 업데이트 typescript 또는 rxjs 버전에서 package.json 파일로 이동하십시오. 예
"typescript": "2.3.4"
하다 npm install
업데이트 (2017 년 6 월 29 일) :-
주석 typescript에 따라 "2.4.0"
작동합니다.
답변
다른 사람들이 지적했듯이이 문제는 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+와 같은 다른 종속성이있는 경우 이는 실제로 지원되는 옵션이 아닐 수 있으며, 프레임 워크 자체를 지금 또는 줄을 끊습니다. 해결하기 더 어려운 문제라고 생각합니다.
답변
인정되는 반창고 접근 방식은 RxJS 직원이 TypeScript 2.4.1을 사용할 때 오류에 대해 수행 할 작업을 결정할 때까지 tsconfig.json 파일에 다음을 추가하는 것입니다.
"compilerOptions": {
"skipLibCheck": true,
}
답변
모듈 확장 을 사용하여 일시적으로 문제를 해결할 수 있습니다.
다음 코드는 나를 위해 문제를 해결했습니다. 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",
와 “타이프” “^ 2.3.4” 다음 NPM 설치 및 역할 NG 의 작업을.
답변
내 2 센트를 넣으려는 시도에서 약간의 세부 사항입니다.
문제는 Typescript 를 최신 버전으로 업그레이드 할 때 발생합니다. 현재는 TypeScript 2.4.1 , [ “업그레이드가 마음 에 들어요 🙂 “], @ Jonnysai 가 답변과 거기에 제공된 링크에서 언급했듯이 문제 및 수정 사항에 대한 자세한 논의.
그래서, 무엇 일을 내게하는 것은이었다
I가 있었다 1. 취소가 설치 타이프 라이터 2.4.1 로 이동하여 먼저 제어판 > 프로그램 및 기능 …
새롭게 2. 설치, 타이프 라이터 2.4.0 다음에, 확인 여기 에 좀 더 간략하게 언급 한대로이 구성 package.json
이 있습니다 .
당신은 다운로드 할 수 있습니다 타이프 라이터 2.4.0을 에서 여기에 , 비주얼 스튜디오 2015
답변
--noStrictGenericChecks
TypeScript 2.4에서이 문제를 해결하기 위해 일시적으로 플래그를 사용할 수 있습니다 .
이다 --noStrictGenericChecks
명령 줄에서, 아니면 그냥 "noStrictGenericChecks": true
에서 "compilerOptions"
필드 tsconfig.json
.
RxJS 6에서는이 문제가 수정됩니다.
유사한 질문을 참조하십시오. TypeScript 2.4의 RxJS 5.x에서이 오류를 어떻게 해결합니까?