При попытке расширить класс из класса в node_modules
машинопись компилятор генерирует ошибку, говоря:«Наблюдаемое <T>» не класс, производный от «Наблюдаемые <T>»
Property 'source' is protected but type 'Observable<T>' is not a class derived from 'Observable<T>'.
Это происходит только при базовый класс - от node_module
.
Базовый класс выглядит следующим образом:
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'));
}
}
подклассов его в проекте:
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();
}
}
Если базовый класс (TestBase
) перемещается из node_module
к проекту его сам и изменить импортировать, чтобы выглядеть как import {TestBase} from "./base";
Ошибка исчезнет.
Это связано с тем, что компиляторы создают типы в разных областях для каждого модуля? Я здесь полностью потерян.
Update:
Это, кажется, только в том случае, когда связывающая node_modules
с npm link
. Кажется, что одно возможное обходное решение на данный момент - это вместо того, чтобы возвращать тип в базовом классе для возврата интерфейса.
Более подробную информацию можно найти здесь:
https://github.com/Microsoft/TypeScript/issues/6496
https://github.com/ReactiveX/rxjs/issues/1744
Я думаю, что вы правы. Вы не можете расширять классы с глобальной областью. [Этот поток в дескрипторе Typcript GitHub repo] (https://github.com/Microsoft/TypeScript/issues/3282), как представляется, описывает некоторые обходные пути. – morphatic
У меня эта проблема даже без 'npm link'. Я пытался использовать 'npm pack' и' npm install' в качестве обходного пути, но без кубиков. https://github.com/robertjd/sp-ng2/pull/1 –
Ответ @Maxime Raineville работал для меня – vincecampanale