当尝试从node_modules
中的类扩展类时,typescript编译器会抛出错误说:
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
相关联时才会发生。
似乎目前一种可能的解决方法是在基类中返回一个类型来返回接口。
可在此处找到更多信息:
答案 0 :(得分:15)
我在为项目开发自定义模块时遇到了一个非常类似的问题。我不是100%确定我们遇到了同样的问题,但看起来非常接近。
我建议删除您的CloudAppendBlob
文件夹并重新安装所有依赖项。
node_modules
这解决了我。
我正在开发的模块有一个抽象类,主要项目试图扩展。但是,在尝试编译主项目时,编译器会抛出相同的错误。
经过一番挖掘,我注意到NPM会在我的模块安装到我的项目时抱怨rm -rf node_modules/
npm cache clean
npm install
。在查看项目的UNMET PEER DEPENDENCY
时,我注意到我的模块中嵌套了另一个node_modules
文件夹,其中包含与主项目共享的一些依赖项。
我不确定这一点,但我认为NPM认为该模块期望与主项目共享不同版本的依赖项。
因此,模块内部的抽象类从其自己的嵌套node_modules
文件夹引用Observable,而主项目从顶级node_modules
文件夹引用Observable。
在尝试解决问题时,其他问题为我提供了一些见解:
答案 1 :(得分:6)
我遇到了同样的问题。
我有以下目录结构(angular2项目)
$propertyString = getXMLAttribute('string'); // '@Foo/Bar/baz'
$propertyString = substr($propertyString, 1);
$moduleCaller = new ModuleCaller();
echo $moduleCaller->callModule($propertyString);
在我的共同点中,我已经定义了对象和服务:
angular
|
---- common_files
|
----- package.json
|
----- index.ts
|
----- catalog1
|
---- package.json
|
---- some_file_with_service_model_comopnent.ts
|
---- index.ts - this is regular barrel file
|
----- catalog2
|
---- app1
|
------ package.json
|
---- apps
|
------ package.json
在我的应用中,我使用的是常用项目,如下所示:
export class ItemBase {}
esport class SomeType extends ItemBase {}
export class ItemServiceBase {
public getItems():Observable<ItemBase> {
//do something
}
}
export class SomeService extends ItemServiceBase {
//some specific operations can go here
}
这导致编译问题:
import { SomeType, SomeTypeService } from "warehouse-system/products-settings";
class AttributeTypesComponent {
private myValues : Observable<SomeType[]>;
private service : SomeTypeService;
constructor(){
this.service = new SomeTypeService();
this.myValues = <Observable<SomeType[]>> this.service.getItems();
}
}
经过调查,我改变了
ERROR in [at-loader] src/app/some_file.ts:22:47
Type 'Observable<ItemBase[]>' cannot be converted to type 'Observable<SomeType[]>'.
Property 'source' is protected but type 'Observable<T>' is not a class derived from 'Observable<T>'.
的类型,但它仍然没有解决问题。编译问题已更改为:
myValues
最终解决方案(解决方法)
什么解决了我的问题,是&#34;重写&#34;应用程序端可观察到:
ERROR in [at-loader] src/app/some_file.ts:22:47
Type 'Observable<SomeType[]>' cannot be converted to type 'Observable<SomeType[]>'.
Property 'source' is protected but type 'Observable<T>' is not a class derived from 'Observable<T>'.
这不是解决它的好方法。在我看来,这个问题是由npm / typescript / observables中的错误引起的。但是直到这个问题在typescript开发方面没有解决,你可以使用这个解决方法作为解决方案。
答案 2 :(得分:6)
如果有多个node_modules文件夹,则必须在主机应用程序的tsconfig中添加路径映射。只需将@ rxjs / *映射到根node_modules / rxjs / *即可。一切正常。
答案 3 :(得分:3)
我遇到了像
这样的疯狂错误Type 'Observable<MessageEvent>' cannot be converted to type 'Observable<MessageEvent>'
Property 'source' is protected but type 'Observable<T>' is not a class derived from 'Observable<T>'
原因是npm link
(实际上是npm i ../other-project
,但它完全相同。)
我的解决方法有点作弊:
(stream as any as Observable<MessageEvent>)
LOL
答案 4 :(得分:3)
仅当您执行npm链接时,才会出现此问题。
将路径添加到客户端项目的tsconfig.json的compileOptions
"paths": { "rxjs/*": ["../node_modules/rxjs/*"]}
这应该起作用,因为它将指定来自rxjs依赖项的路径。
答案 5 :(得分:0)
您可以在tsconfig.json中添加路径映射,以将依赖项中的rxjs映射到node_modules文件夹中的路径:
{
"compilerOptions": {
"baseUrl": ".",
"paths": {
"rxjs": ["node_modules/rxjs"]
}
}
更多文档,请访问Typescript site
答案 6 :(得分:0)
列出rxjs模块后:
npm列表rxjs
+-@ angular / cli @ 1.6.6 | +-@ angular-devkit / core @ 0.0.29 | |
-- rxjs@5.5.10 | +-- @angular-devkit/schematics@0.0.52 | |
-rxjs@5.5.10 |-- rxjs@5.5.10
-rxjs@5.5.6
您可以看到同一模块的2个版本。我的项目需要较低版本的rxjs,例如anglular / cli需要更高版本的rxjs。
它之前没有引起任何问题,但是突然所有具有相同依赖项的项目都抛出了相同的TS90010错误,例如:
[加载器]中的错误。/src/main/webapp/app/admin/user-management/user-management-detail.component.ts:23:9 TS90010:类型“ Subscription”不可分配给类型“ Subscription”。存在两种使用此名称的不同类型,但是它们是无关的。
属性“ _parent”受保护,但类型“ Subscription”不是从“ Subscription”派生的类。
最后,我将package.json中的打字稿版本从2.6.2更新为2.9.2,所有错误都消失了。
答案 7 :(得分:0)
对我来说,这是我的编辑问题。 VSCode包含了从声明文件(*.d.ts
)导入的内容,而实际的类却在另一个地方。
我用实际的类文件导入替换了声明文件导入。
答案 8 :(得分:-1)
实际上可能是由于您的打字稿版本更改导致此问题
尝试更改您的打字稿版本
您可以在
中找到它 package.json
设置为2.4.3
如果不起作用,则只需尝试cli
npm unlink typescript
npm install typescript@2.3.4
以及安装完成后 packages.json
plz检查 它应该工作 依赖中
“依赖项”:{
“ @ angular / animations”:“ ^ 5.2.0”,
“ @ angular / common”:“ ^ 5.2.0”,
“ @ angular / compiler”:“ ^ 5.2.0”,
“ @ angular / core”:“ ^ 5.2.0”,
“ @ angular / forms”:“ ^ 5.2 .0“,
” @ angular / http“: “ ^ 5.2.0”,
“ @ angular / platform-browser”:“ ^ 5.2.0”,
“ @ angular / platform-browser-dynamic”:“ ^ 5.2.0”,
“ @ angular / router”:“ ^ 5.2.0”,
“ core-js”:“ ^ 2.4.1”,
“ rxjs”:“ 5.4.3”,
“打字稿”:“ ^ 2.3.4”,<< ---------------删除^
“ zone.js”:“ ^ 0.8.19”
但有一点很清楚,这不是错误,这是由于环境变化引起的
如果仍然遇到问题,请尝试 重新安装节点模块
祝你好运.......