【发布时间】:2016-11-05 05:36:11
【问题描述】:
当试图从 node_modules 中的类扩展一个类时,打字稿编译器会抛出一个错误:
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"; 错误消失。
这是因为编译为每个模块创建了不同范围内的类型吗?我完全迷路了。
更新:
这似乎只在将node_modules 与npm link 链接时发生。
目前似乎一种可能的解决方法是在基类中返回一个接口而不是返回一个类型。
更多信息可以在这里找到:
【问题讨论】:
-
我认为你是对的。您不能扩展具有全局/环境范围的类。 This thread on the Typescript GitHub repo 似乎描述了一些解决方法。
-
即使没有
npm link,我也遇到了这个问题。我尝试使用npm pack和npm install作为解决方法,但没有骰子。 github.com/robertjd/sp-ng2/pull/1 -
@Maxime Raineville 的回答对我有用
标签: typescript rxjs5