typescript - 'Observable' är inte en klass som härstammar från 'Observable'


När man försöker utöka en klass från en klass i node_modules kastar TypeScript-kompilatorn ett fel som säger:

Egenskapen 'source' är skyddad men typen 'Observable<T>' är inte en klass som härstammar från 'Observable<T>'.

Detta händer bara när basklassen är från en node_module.

Bas-klassen ser ut så här:

import {Observable} from "rxjs/Observable";
export abstract class TestBase<T> {

    request(options: any):Observable<T> {
        return Observable.throw(new Error('TestBase is abstract class. Extend it and implement own request method'));
    }
}

Att skapa en underklass av det i ett projekt:

import {Observable} from "rxjs/Observable";
import {TestBase} from "@org/core";

class SocketResponse {

}

class Socket {
    request(): Observable<SocketResponse> {
        return new Observable.of(new SocketResponse());
    }
}

export class Sub extends TestBase<SocketResponse> {
    request(options:any):Observable<SocketResponse> {
        return new Socket().request();
    }
}

Om basklassen (TestBase) flyttas från node_module till projektet själv och ändrar importen till att se ut som import {TestBase} from "./base"; försvinner felet.

Beror detta på att kompilatorn skapar typerna i olika scope för varje modul? Jag är helt förlorad här.

Uppdatering:

Det verkar bara hända när man länkar node_modules med npm link. Det verkar som ett möjligt tillfälligt sätt att lösa det för tillfället är att istället för att returnera en typ i basklassen returnera ett gränssnitt.

Mer information kan hittas här:

https://github.com/Microsoft/TypeScript/issues/6496

https://github.com/ReactiveX/rxjs/issues/1744

Svar #1

Jag stötte precis på ett väldigt liknande problem när jag utvecklade en anpassad modul för ett projekt. Jag är inte 100% säker på att vi hade samma problem, men det ser ganska likt ut.

Hur jag löste mitt problem

Jag skulle föreslå att du raderar din node_modules-mapp och installerar om alla dina beroenden.

rm -rf node_modules/
npm cache clean
npm install

Det löste det för mig.

Vad problemet var (tror jag)

Modulen jag utvecklade hade en abstrakt klass som huvudprojektet försökte utöka. Men när man försökte kompilera huvudprojektet skulle kompilatorn kasta samma fel som du får.

Efter lite grävande märkte jag att NPM klagade på en UNMET PEER DEPENDENCY när jag installerade mitt modul i mitt projekt. När jag tittade inuti node_modules i projektet, märkte jag att mitt modul hade en annan node_modules-mapp inuti sig med några beroenden som det delade med huvudprojektet.

Jag är inte säker på detta, men jag tror att NPM trodde att modulen förväntade sig en annan version av beroenden som den delade med huvudprojektet.

Så den abstrakta klassen inuti modulen refererade till Observable från sin egen inbäddade node_modules-mapp medan huvudprojektet refererade till Observable från den översta nivån node_modules-mappen.

Mer information

Denna andra fråga gav mig viss insikt när jag försökte lösa mitt problem:

Varför säger npm install att jag har ouppfyllda beroenden?

Svar #2

Om det finns flera node_modules-mappar måste du lägga till en sökkartläggning i värdappens tsconfig. Kartlägg bara @rxjs/* till rotens node_modules/rxjs/*. Då fungerar allt bra.

Relaterade artiklar