2016-07-03 1 views
29

При попытке расширить класс из класса в 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

+2

Я думаю, что вы правы. Вы не можете расширять классы с глобальной областью. [Этот поток в дескрипторе Typcript GitHub repo] (https://github.com/Microsoft/TypeScript/issues/3282), как представляется, описывает некоторые обходные пути. – morphatic

+1

У меня эта проблема даже без 'npm link'. Я пытался использовать 'npm pack' и' npm install' в качестве обходного пути, но без кубиков. https://github.com/robertjd/sp-ng2/pull/1 –

+0

Ответ @Maxime Raineville работал для меня – vincecampanale

ответ

3

я получил такой же вопрос.

Я следующий каталог структуру (angular2 проект)

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, но он все еще не решает проблему.вопросы компиляции изменен:

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>'.

Окончательное решение (обходной)

Что решить мою проблему, был "переписывания" наблюдаемым на стороне приложения:

this.myValues = Observable.create(subscriber => { 
     this.service.getItems().subscribe(items => subscriber.next(items)); 
    }); 

Это не очень хороший способ решить эту проблему. По-моему, эта проблема вызвана ошибкой в ​​npm/typescript/observables. Но до тех пор, пока проблема не будет решена на стороне разработчиков, вы можете использовать это решение как решение.

11

Я просто столкнулся с очень похожими проблемами при разработке пользовательского модуля для проекта. Я не уверен на 100%, что у нас такая же проблема, но она выглядит довольно близко.

Как решить мою проблему

Я хотел бы предложить удалить папку node_modules и переустановить все зависимости.

rm -rf node_modules/ 
npm cache clean 
npm install 

Это решило его для меня.

чем проблема была (я думаю)

Модуль я разрабатывал был абстрактный класс, что основной проект пытается расширить. Однако, пытаясь скомпилировать основной проект, компилятор выдаст ту же ошибку, которую вы получаете.

После небольшого поиска, я заметил, что NPM будет жаловаться на UNMET PEER DEPENDENCY при установке моего модуля в мой проект. Когда я смотрел внутри проекта node_modules, я заметил, что в моем модуле есть еще одна папка node_modules, вложенная внутри нее с некоторыми зависимостями, которые она разделяет с основным проектом.

Я не уверен в этом, но я думаю, что НПМ считал, что модуль ожидает другую версию зависимостей, которую он разделяет с основным проектом.

Таким образом, абстрактный класс внутри модуля ссылался на наблюдаемый из его собственной вложенной папки node_modules, в то время как основной проект ссылался на наблюдаемый с верхнего уровня node_modules.

Более подробная информация

This другие вопросы дает некоторое представление для меня при попытке решить мою проблему:

Why does npm install say I have unmet dependencies?

+0

Для тех, кто ищет решение, этот работал для меня. – vincecampanale

+0

Если подобная проблема, удаление 'node_modules' в пакете npm решило проблему. Хороший собеседник. –

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

3

Если есть несколько node_modules папки, которые вы должны добавить отображение пути в TSconfig хост-приложения. Просто сопоставьте @ rxjs/* с корнем node_modules/rxjs/*. Тогда все работает нормально.