rxjs / Subject.d.ts 오류 : 'Subject <T>'클래스가 기본 클래스 'Observable <T>'를 잘못 확장합니다.


90

이 튜토리얼 에서 샘플 템플릿 코드를 추출 하고 시작하기 위해 아래 두 단계를 수행했습니다.

  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 : 여기서 응답하는 데 약간 늦을 수 있지만 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"
  }
}



이것은 rxjs@5.4.2 에서 수정 된 것 같습니다 .

답변:


70

당신은 2.3.4 타이프 업데이트하거나 6 알파 rxjs 필요

프로젝트 업데이트 typescript 또는 rxjs 버전에서 package.json 파일로 이동하십시오. 예

"typescript": "2.3.4"

하다 npm install

업데이트 (2017 년 6 월 29 일) :-

주석 typescript에 따라 "2.4.0"작동합니다.


6
"typescript": "^2.3.4"2.4.1과 일치하며 2.4는 RxJS의 문제를 노출하는 버전입니다.
cartant

5
typescript 버전을 "2.4.0"으로 대체했습니다.
Ajax

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 유형 정의의 불일치가 드러났고 결과적으로 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+와 같은 다른 종속성이있는 경우 이는 실제로 지원되는 옵션이 아닐 수 있으며, 프레임 워크 자체를 지금 또는 줄을 끊습니다. 해결하기 더 어려운 문제라고 생각합니다.

24

인정되는 반창고 접근 방식은 RxJS 직원이 TypeScript 2.4.1을 사용할 때 오류에 대해 수행 할 작업을 결정할 때까지 tsconfig.json 파일에 다음을 추가하는 것입니다.

"compilerOptions": {

    "skipLibCheck": true,

 }

감사합니다. 다른 많은 것을 시도했지만이 오류는 잘못된 버전의 잘못된 패키지와 관련이있는 것 같습니다. 서로를 지원하지 않습니다 ...
Salim

2
All LibCheck를 비활성화하거나 억제하는 것은 좋은 생각이 아닙니다.
CharanRoot

나는에 같은 일을 제안 GitHub의 문제
숀 뉴웰

@Jonnysai는 해당 코드를 소유하지 않았기 때문에 라이브러리에 문제를 제출 한 다음 자체 개발 작업을 계속할 수 있으므로 단기적으로 lib 검사를 억제하는 것이 좋습니다. 자신의 문제를 제출하고 문제에 연결할 수 있으며 유형이 수정되면 억제를 해제 할 수 있습니다.
숀 뉴웰

6
진짜 해결책은해야 하지 하는 skipLibCheck. 그렇게한다면 잠재적으로 다른 문제에 대해 유약을 바를 수 있습니다. 더 나은 해결책은 noStrictGenericChecksRxJS가 업데이트 될 때까지입니다.
Daniel Rosenwasser

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 자체가 자체 모양을 설명하기 위해이 기술을 많이 사용하는 것은 아이러니 할 수 있지만 실제로는 일반적으로 여러 문제에 적용 할 수 있습니다.

확실히 한계와 거친 가장자리가 있지만이 기술을 강력하게 만드는 부분은 기존 선언을 향상시켜 전체 파일을 분기하고 유지 관리하지 않고도 형식을 더 안전하게 만드는 데 사용할 수 있다는 것입니다.


이 파일을 어디에 추가하거나 가져 오나요?
Dave

1
프로젝트의 아무 곳에 나 추가하여 컴파일러에서 선택합니다. 명시적인 파일 목록을 사용하는 경우 포함되어 있는지 확인하십시오. 그렇지 않으면 그것은 tsconfig.json 파일 위에 아니다 자동으로 한 발탁한다
Aluan 하다드

2
나는 이것이 가장 방해가되지 않는 것처럼 보였기 때문에 이것을 시도했습니다. 잘 했어요.
Stephen Holt

1
파일을 추가하는 방법을 알아 냈습니다. "import 'rxjs / Subject';" ( "from"또는 중괄호 제외) app.component.ts.
John Pankowicz

1
@JaredWhipple 이것은 심각한 문제이며 typechecking 이상의 의미를 가지고 있습니다. 당신은 사용할 수 있습니다 "paths"tsconfig.json명시 적으로 위치를 지정 "rxjs""rxjs/*"유형 검사를 위해 해결해야한다. 그러나 여러 버전이 있으면 런타임 문제가 발생할 수 있습니다. instanceof다른 테스트를 사용하지 않더라도 deps는 덜 원칙적 일 수 있습니다. 가장 좋은 방법은 RxJS를 피어 종속성으로 변경하는 것을 제안하는 videogular2 문제를 여는 것입니다.
Aluan 하다드

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","타이프" "^ 2.3.4" 다음 NPM 설치역할 NG 의 작업을.


8

내 2 센트를 넣으려는 시도에서 약간의 세부 사항입니다.

문제는 Typescript 를 최신 버전으로 업그레이드 할 때 발생합니다. 현재는 TypeScript 2.4.1 , [ "업그레이드가 마음 에 들어요 :) "], @ Jonnysai 가 답변과 거기에 제공된 링크에서 언급했듯이 문제 및 수정 사항에 대한 자세한 논의.

그래서, 무엇 일을 내게하는 것은이었다
I가 있었다 1. 취소가 설치 타이프 라이터 2.4.1 로 이동하여 먼저 제어판 > 프로그램 및 기능 ...
새롭게 2. 설치, 타이프 라이터 2.4.0 다음에, 확인 여기 에 좀 더 간략하게 언급 한대로이 구성 package.json이 있습니다 . 당신은 다운로드 할 수 있습니다 타이프 라이터 2.4.0을 에서 여기에 , 비주얼 스튜디오 2015

여기에 이미지 설명 입력



이것은 "해결 방법"없이 매우 간단하게 작동했습니다. 나는 이것이 중요한지 확신하지 못하지만 내 rxjs는 "5.0.1"이었고 나는 그것을 변경하지 않았지만 모든 것이 괜찮아 보인다. 2 센트 주셔서 감사합니다. 도움이되었습니다!
Tom A

Typescript 2.3.4를 사용 하여이 문제가 있습니다. 따라서 2.4.1로 업그레이드하여 문제가 발생한 것은 옳지 않은 것 같습니다. 현재 angular-cli는 <2.4.0이 필요하다고 말하고 있기 때문에 2.3.4를 설치합니다.
John Pankowicz

5

--noStrictGenericChecksTypeScript 2.4에서이 문제를 해결하기 위해 일시적으로 플래그를 사용할 수 있습니다 .

이다 --noStrictGenericChecks명령 줄에서, 아니면 그냥 "noStrictGenericChecks": true에서 "compilerOptions"필드 tsconfig.json.

RxJS 6에서는이 문제가 수정됩니다.

유사한 질문을 참조하십시오. TypeScript 2.4의 RxJS 5.x에서이 오류를 어떻게 해결합니까?


깃발을 어디에 두나요?
Dave

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

tsconfig.config 파일에서 noStrictGeneric 옵션을 true로 유지하십시오.

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

3

아래 이미지 및 빌드 응용 프로그램과 같이 "compilerOptions" 노드 아래 tsconfig.json 파일에 "noStrictGenericChecks": true 를 추가 합니다. 이 오류를 추가 한 후에도 동일한 오류가 해결되었습니다. 여기에 이미지 설명 입력


2

같은 문제를 발견하고 "rxjs": "5.4.1" , "typescript": "~ 2.4.0" 을 사용하고 "noStrictGenericChecks": true 를 tsconfig.json에 추가 하여 해결했습니다 .


1

RxJS 6에서는이 문제가 수정되지만 임시 해결 방법으로 noStrictGenericChecks컴파일러 옵션을 사용할 수 있습니다 .

에서 tsconfig.json,에 넣어 compilerOptionstrue로 설정합니다.

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

명령 줄에서 --noStrictGenericChecks .

발생하는 이유 :

TypeScript 2.4에는 엄격 성이 변경되었으며 Subject는 올바른 Observable로 올라가지 않습니다. 서명은 정말

(연산자 : 연산자) => 관찰 가능

이것은 RxJS 6에서 수정 될 것입니다.


1

Package.json 파일로 이동하여 아래 구성을 수정하십시오.

...
  "rxjs": "5.4.1",
  "typescript": "~2.4.0"
...

작동합니다


0

위의 방법만으로는 도움이되지 않았습니다. 그러나 다음 접근 방식을 사용하면 됩니다. TypeScript 2.4 및 RxJs 5에서 "Subject가 Observable을 잘못 확장 함"오류를 어떻게 해결합니까?

문제를 해결했습니다. 또한 RxJs 6에서 문제가 해결되었다고 언급되었으므로 이것은 임시 수정에 가깝습니다.이 훌륭한 예제를 성공적으로 실행하는 데 도움이되었습니다 (이전에 컴파일되었지만로드 시간 동안 오류가 발생했습니다) : Angular 4 애플리케이션 개발 Bootstrap 4 및 TypeScript 사용



0

이제 우리는 ionic-native 모듈이 필요하지 않습니다. @ ionic-native / core 만 필요합니다. 운영

npm uninstall ionic-native --save

그것은 당신의 문제를 해결할 것입니다 ..



0

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에 이미 이것을 가지고 있기 때문에 저에게 효과적입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.