Lorsque l'on essaie d'étendre une classe à partir d'une classe dans une node_modules
le compilateur de typescript jette une erreur disant :
Property 'source' is protected but type 'Observable<T>' is not a class derived from 'Observable<T>'.
Cela ne se produit que lorsque la classe de base est issue d'une node_module
.
La classe de base ressemble :
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'));
}
}
Le sous-classer dans un projet :
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();
}
}
Si la classe de base ( TestBase
) est déplacé de la node_module
au projet lui-même et changez l'importation pour qu'elle ressemble à ceci import {TestBase} from "./base";
L'erreur disparaît.
Est-ce dû au fait que la compilation crée les types dans différents scopes pour chaque module ? Je suis complètement perdu là.
Mise à jour :
Cela semble se produire uniquement lors de l'établissement d'un lien entre le node_modules
con npm link
. Il semble qu'une solution possible pour le moment soit de retourner une interface au lieu d'un type dans la classe de base.
Vous trouverez de plus amples informations ici :
2 votes
Je pense que tu as raison. Vous ne pouvez pas étendre les classes qui ont une portée globale/ambiante. Ce fil de discussion sur le repo GitHub de Typescript semble décrire quelques solutions de contournement.
1 votes
J'ai ce problème même sans
npm link
. J'ai essayé d'utilisernpm pack
ynpm install
comme solution de rechange, mais pas de résultat. github.com/robertjd/sp-ng2/pull/10 votes
La réponse de @Maxime Raineville a fonctionné pour moi