'Observable <t>'不是派生自'Observable <t>'的类

时间:2016-07-03 09:30:39

标签: typescript rxjs5

当尝试从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_modulesnpm link相关联时才会发生。 似乎目前一种可能的解决方法是在基类中返回一个类型来返回接口。

可在此处找到更多信息:

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

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

9 个答案:

答案 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。

更多信息

在尝试解决问题时,其他问题为我提供了一些见解:

Why does npm install say I have unmet dependencies?

答案 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)

实际上可能是由于您的打字稿版本更改导致此问题

尝试更改您的打字稿版本

  1. 您可以在

    中找到它

    package.json

设置为2.4.3

  1. 如果不起作用,则只需尝试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-b​​rowser”:“ ^ 5.2.0”,       
“ @ angular / platform-b​​rowser-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”

但有一点很清楚,这不是错误,这是由于环境变化引起的

如果仍然遇到问题,请尝试 重新安装节点模块

祝你好运.......