rxjs / Subject.d.ts त्रुटि: क्लास 'विषय <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

मैं देखता हूं कि लिफ्ट की विषयवस्तु में इस प्रकार है: -

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

और ऑब्जर्वेबल.ट में इसे नीचे के रूप में परिभाषित किया गया है-

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

नोट: - 1. मैं Angular2 में नया हूं और चीजों को पकड़ना चाहता हूं।

  1. लिफ्ट विधि की असंगत परिभाषाओं के कारण त्रुटि हो सकती है

  2. मैं इस github धागे के माध्यम से पढ़ा

  3. अगर मुझे rxjs के कुछ अलग संस्करण को स्थापित करने की आवश्यकता है, तो कृपया बताएं कि कैसे सही rxjs की स्थापना रद्द करें और स्थापित करें।

Edit1: यहां जवाब देने में मुझे थोड़ी देर हो सकती है लेकिन टाइपस्क्रिप्ट 2.3.4 या rxjj 6 अल्फा का उपयोग करने के बाद भी मुझे वही त्रुटि मिलती है । नीचे मेरा पैकेज है। 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

अपने प्रोजेक्ट अपडेट टाइपस्क्रिप्ट या rxjs संस्करण में अपने पैकेज.जॉन फ़ाइल पर जाएं। उदाहरण

"typescript": "2.3.4"

करना npm install

अद्यतन (2017/06/29): -

"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" मेरे लिए काम नहीं किया।
मिया

1
संयोजन "typescript": "2.3.0"और "rxjs": "5.4.1"मेरे लिए काम किया
ericdemo07

@ जोनिसाई सॉरी, मैंने जो कहा, उसे वापस लेता हूं। परियोजना संकलित है, लेकिन मुझे एक रनटाइम त्रुटि मिली और 2.3.4 पर डाउनग्रेड हो गई। यहाँ और अधिक: stackoverflow.com/a/44556137
Carcamano

25

जैसा कि दूसरों ने बताया है कि यह मुद्दा टाइपस्क्रिप्ट 2.4 में शुरू किए गए जेनेरिक के सख्त प्रकार की जाँच के परिणामस्वरूप आया था। इसने RxJS प्रकार की परिभाषा में एक असंगति को उजागर किया और परिणामस्वरूप RxJS संस्करण 5.4.2 में तय किया गया । इसलिए आदर्श समाधान केवल 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 सही पर सेट करना। यह आदर्श नहीं है क्योंकि आपको रिपोर्ट की गई कुछ प्रकार की त्रुटियां नहीं मिल सकती हैं।
  • RxJS 6 अल्फा को अपग्रेड करते हुए - यह देखते हुए कि इसमें बदलाव हो रहे हैं यह आपके ऐप को बुरी तरह से प्रलेखित तरीके से तोड़ सकता है, यह देखते हुए कि यह अभी भी अल्फा में है। इसके अतिरिक्त अगर आपके पास अन्य निर्भरताएं हैं जैसे कि कोणीय 2+ यह वास्तव में एक समर्थित विकल्प नहीं हो सकता है, तो फ्रेमवर्क को अभी या नीचे तोड़कर। जो मुझे लगता है कि हल करने के लिए एक और भी कठिन मुद्दा है।

24

जब तक RxJS लोग तय नहीं करते कि वे टाइपस्क्रिप्ट 2.4.1 का उपयोग करते समय त्रुटि के बारे में क्या करना चाहते हैं, जब तक एक tsconfig.json फ़ाइल में एक एडेड बैंड-ऐडवर्ड एप्रोच निम्नलिखित है।

"compilerOptions": {

    "skipLibCheck": true,

 }

इसके लिए धन्यवाद, यह काम किया। मैंने बहुत सी अन्य चीजों की कोशिश की, लेकिन मुझे लगता है कि यह त्रुटि गलत पैकेज के साथ गलत संस्करण से संबंधित है एक दूसरे का समर्थन नहीं करता ...
सलीम

2
मुझे लगता है कि ऑल लिबेक को निष्क्रिय या दबाने के लिए इसका अच्छा विचार नहीं है।
चरणरूट


@Jonnysai जब से आप उस कोड के मालिक नहीं हैं, तब तक लिबर चेक चेक करना अल्पावधि में ठीक है क्योंकि आप लाइब्रेरीज़ के साथ समस्याएँ दर्ज कर सकते हैं, और फिर अपना स्वयं का विकास कार्य जारी रख सकते हैं। आप अपने स्वयं के मुद्दे को दर्ज कर सकते हैं और उनके मुद्दे से लिंक कर सकते हैं, और जब उनके प्रकार तय हो जाते हैं, तो आप इसे बंद कर सकते हैं।
सीन न्यूवेल

6
असली समाधान नहीं होना चाहिए skipLibCheck। यदि आप ऐसा कर रहे हैं, तो आप संभावित रूप से अन्य समस्याओं पर प्रकाश डाल रहे हैं। एक बेहतर समाधान है noStrictGenericChecksजब तक कि आरएक्सजेएस अपडेट न हो जाए।
डैनियल रोसेनवेसर

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>;
  }
}

हालांकि यह शायद विडंबना है कि खुद के आकार का वर्णन करने के लिए आरएक्सजेएस स्वयं इस तकनीक का इतना भारी उपयोग करता है, यह वास्तव में समस्याओं की एक सरणी के लिए लागू होता है।

हालांकि निश्चित रूप से सीमाएं और उबड़-खाबड़ किनारे हैं, इस तकनीक को शक्तिशाली बनाने का एक हिस्सा यह है कि हम इसका उपयोग मौजूदा घोषणाओं को बढ़ाने के लिए कर सकते हैं, जिससे वे बिना फोर्किंग के पूरी तरह सुरक्षित रह सकते हैं और पूरी फाइल को बनाए रख सकते हैं।


आप इस फ़ाइल को कहां जोड़ते हैं या आयात करते हैं
डेव

1
इसे अपने प्रोजेक्ट में कहीं भी इस तरह से जोड़ें कि यह कंपाइलर द्वारा उठाया जाएगा। यदि आप स्पष्ट फ़ाइल सूचियों का उपयोग कर रहे हैं, तो सुनिश्चित करें कि यह शामिल है। अन्यथा इसे स्वचालित रूप से तब तक उठाया जाना चाहिए जब तक कि यह tsconfig.json फ़ाइल से ऊपर न हो
Haddad

2
मैंने यह कोशिश की, क्योंकि यह सबसे कम विघटनकारी बात थी। ठीक काम किया।
स्टीफन होल्ट

1
मुझे लगा कि फ़ाइल को कैसे जोड़ा जाए - "आयात 'rxjs / विषय';" (बिना "से" या घुंघराले ब्रेसिज़ के बिना) app.component.ts में।
जॉन पेंकोविज़

1
@JaredWhipple यह एक गंभीर मुद्दा है और इसके टाइपकास्टिंग से बहुत अधिक प्रभाव हैं। आप उपयोग कर सकते हैं "paths"में tsconfig.jsonस्पष्ट रूप से जहां निर्दिष्ट करने के लिए "rxjs"और "rxjs/*"typechecking के लिए समाधान हो जाना चाहिए। हालाँकि, कई संस्करण होने से रनटाइम समस्याएँ होने की संभावना है। यहां तक ​​कि अगर आप उपयोग नहीं करते हैं instanceofऔर इस तरह के अन्य परीक्षण करते हैं, तो आपके डिप्स कम राजसी हो सकते हैं। सबसे अच्छी बात यह है कि एक मुद्दे को खोलने के लिए वीडियोगुलर 2 में आरएक्सजेएस को एक सहकर्मी निर्भरता में बदलने का सुझाव दिया गया है।
एलुआन हदद

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

in package.json "rxjs": "^5.4.2", और "टाइपस्क्रिप्ट": "^ 2.3.4", फिर npm स्थापित करें और एनजी को अपने काम की सेवा दें


8

बस थोड़ा सा विस्तार, मेरे दो सेंट में डालने की कोशिश में।

समस्या तब उत्पन्न होती है जब हम टाइपस्क्रिप्ट को नवीनतम संस्करण में अपग्रेड करते हैं , जो अब तक टाइपस्क्रिप्ट 2.4.1 था , ["जैसा कि हम अपग्रेड से प्यार करते हैं:"], और जैसा @ जोननीसाई द्वारा उल्लेख किया गया है। उनके उत्तर में और वहां प्रदान की गई लिंक, समस्या और उसके समाधान के बारे में विस्तृत चर्चा।

तो, क्या काम किया मेरे लिए किया गया था:
1. मैं पड़ा अन स्थापित टाइपप्रति 2.4.1 पहले, के लिए जा रहा द्वारा नियंत्रण कक्ष > प्रोग्राम और सुविधाएँ ...
2. स्थापित करें, नए सिरे से, टाइपप्रति 2.4.0 , और उसके बाद यह सुनिश्चित कर लें, में package.jsonफ़ाइल, आपके पास यह कॉन्फ़िगरेशन है, जैसा कि यहां बताया गया है कि यह कम विवरण में है। आप डाउनलोड कर सकते हैं टाइपप्रति 2.4.0 से यहाँ , विजुअल स्टूडियो 2015 के लिए

यहां छवि विवरण दर्ज करें



यह बहुत ही सरलता से बिना किसी "वर्कआराउंड" के काम करता है। मुझे यकीन नहीं है कि यह मायने रखता है लेकिन मेरे rxjs "5.0.1" थे और मैंने इसे नहीं बदला, हालांकि यह सब ठीक लगता है। आपके दो सेंट के लिए धन्यवाद - इसने मेरी मदद की!
टॉम ए

मैं भी इस समस्या को टाइपस्क्रिप्ट 2.3.4 का उपयोग कर रहा हूँ। तो यह सही नहीं लगता है कि 2.4.1 में अपग्रेड होने के कारण समस्या उत्पन्न होती है। वर्तमान कोणीय-क्ली 2.3.4 स्थापित करता है क्योंकि यह कहता है कि इसके लिए <2.4.0 की आवश्यकता है।
जॉन Pankowicz

5

आप --noStrictGenericChecksटाइपस्क्रिप्ट 2.4 में इसे प्राप्त करने के लिए झंडे का अस्थायी रूप से उपयोग कर सकते हैं ।

यह वह जगह है --noStrictGenericChecksसिर्फ कमांड लाइन पर, या "noStrictGenericChecks": trueमें "compilerOptions"में क्षेत्र tsconfig.json

ध्यान रखें, RxJS 6 में यह सुधार होगा।

इस तरह का प्रश्न देखें: टाइपस्क्रिप्ट 2.4 में RxJS 5.x में मुझे इस त्रुटि के बारे में कैसे पता चलेगा?


आप झंडा कहाँ लगाते हैं
डेव

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

"NoStrictGenericChecks" जोड़ें : tsconfig.json फ़ाइल में "compilerOptions" नोड के तहत सच है जैसा कि नीचे दी गई छवि और बिल्ड एप्लिकेशन में दिखाया गया है। इस त्रुटि को हल करने के बाद मुझे उसी त्रुटि का सामना करना पड़ा है। यहां छवि विवरण दर्ज करें


2

मुझे वही समस्या मिली और मैंने इसे "rxjs": "5.4.1" , "टाइपस्क्रिप्ट": "~ 2.4.0" और "noStrictGenericChecks": tsconfig.json में शामिल करके इसे हल किया।


1

RxJS 6 में यह निश्चित होगा, लेकिन अस्थायी वर्कअराउंड के रूप में, आप इसका उपयोग कर सकते हैं noStrictGenericChecks कंपाइलर विकल्प का ।

इसमें tsconfig.json, इसे डालें compilerOptionsऔर इसे सच पर सेट करें।

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

कमांड लाइन पर --noStrictGenericChecks

ऐसा क्यों हो रहा है:

टाइपस्क्रिप्ट 2.4 में एक सख्त बदलाव है, और विषय सही अवलोकन के लिए नहीं उठा रहा है। हस्ताक्षर वास्तव में होने चाहिए थे

(ऑपरेटर: ऑपरेटर) => अवलोकन योग्य

यह RxJS 6 में तय किया जाएगा।


1

Package.json फ़ाइल पर जाएं और नीचे कॉन्फ़िगरेशन को संशोधित करें

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

यह काम करेगा


0

हालांकि, उपरोक्त दृष्टिकोण का उपयोग करते हुए, अकेले उपर्युक्त का उपयोग करने में मदद नहीं मिली: मुझे यह कैसे मिलता है "टाइपजेक्ट 2.4 और आरएक्सजे 5 में" ऑब्जर्वेबल को गलत तरीके से प्रस्तुत करता है।

मुद्दों को हल किया। यह भी उल्लेख किया गया है कि इस मुद्दे को RxJs 6 में तय किया गया है, इसलिए यह एक अस्थायी सुधार है, जिसने मुझे इस महान उदाहरण को सफलतापूर्वक चलाने में मदद की (जो कि पहले संकलन किया गया था लेकिन लोड समय के दौरान त्रुटि दी गई): कोणीय 4 अनुप्रयोग विकास बूटस्ट्रैप 4 और टाइपस्क्रिप्ट के साथ



0

अब हमें आयनिक-देशी मॉड्यूल की आवश्यकता नहीं है - हमें केवल आयनिक-मूल / कोर की आवश्यकता है। Daud

npm uninstall ionic-native --save

यह आपकी समस्या का समाधान करेगा ।।



0

ज़मग और राहुल शर्मा के जवाब का धन्यवाद, यह काम करता है! @ ज़मग @ राहुल शर्मा

  "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

हां समस्या टाइपस्क्रिप्ट 2.4.1 के साथ थी। मैंने अभी इसे कंट्रोल पैनल से अनइंस्टॉल किया है और यह मेरे लिए काम करता है क्योंकि विजुअल स्टूडियो 2017 में पहले से ही यह है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.