typescript rxjs rxjs5 typescript2.4

¿Cómo puedo evitar este error "El sujeto extiende incorrectamente el Observable" en TypeScript 2.4 y RxJS 5.x?



rxjs5 typescript2.4 (7)

Cuando compilo, obtengo el siguiente error de compilación en los archivos de declaración de RxJS:

node_modules/rxjs/Subject.d.ts(16,22): error TS2415: Class ''Subject<T>'' incorrectly extends base class ''Observable<T>''. Types of property ''lift'' are incompatible. Type ''<R>(operator: Operator<T, R>) => Observable<T>'' is not assignable to type ''<R>(operator: Operator<T, R>) => Observable<R>''. Type ''Observable<T>'' is not assignable to type ''Observable<R>''. Type ''T'' is not assignable to type ''R''.

¿Qué está pasando aquí, y cómo soluciono esto sin degradar a TypeScript 2.3 o anterior?


Solución

RxJS 5.4.2 ahora debería funcionar perfectamente con TypeScript 2.4.1. Simplemente actualice a 5.4.2+ si es posible.

npm install --save rxjs@^5.4.2

Si no, la siguiente solución debería funcionar.

Solución alternativa

Las versiones más nuevas de RxJS tendrán esto solucionado, pero como una solución temporal, puede usar la opción del compilador noStrictGenericChecks .

En tsconfig.json , póngalo en "compilerOptions" y tsconfig.json en true .

{ "compilerOptions": { "noStrictGenericChecks": true } }

En la línea de comandos, es --noStrictGenericChecks .

Por qué está sucediendo

TypeScript 2.4 tiene un cambio de rigor, y el Subject<T> no se levanta al Observable correcto. La firma realmente debería haber sido

<R>(operator: Operator<T, R>) => Observable<R>

Esto se solucionará en RxJS 6.


Añadir

"noStrictGenericChecks": true

en el archivo tsconfig.json


En su clase de Sujeto:

cambiar esta línea:

lift<R>(operator: Operator<T, R>): Observable<T>;

a :

lift<R>(operator: Operator<T, R>): Observable<R>;


Este es un problema de desajuste entre rxjs y typscript, usando "rxjs": "5.4.2" y "mecanografiado": "~ 2.3.4" funciona para mí


He hecho los siguientes dos cambios en el archivo package.json.

1) cambió la versión de rxjs a 5.4.1 en la sección de dependencias.

"dependencias": {
"rxjs": "5.4.1"}

2) cambió la versión de mecanografiado a 2.4.0 en la sección devDependencias.

"devDependencies": {"typescript": "2.4.0"}

Ejecuté el comando '' npm install '' después de hacer los dos cambios y funcionó.


He realizado los cambios a continuación en el archivo package.json.

"dependencies": { "@angular/animations": "4.1.3", "@angular/common": "4.4.6", "@angular/compiler": "4.4.6", "@angular/compiler-cli": "2.4.8", "@angular/core": "4.4.6", "@angular/forms": "4.4.6", "@angular/http": "4.4.6", "@angular/platform-browser": "4.4.6", "@angular/platform-browser-dynamic": "4.4.6", "@angular/platform-server": "4.4.6", "@angular/router": "4.4.6", "@ionic/storage": "2.0.0", "cordova-plugin-console": "1.0.5", "cordova-plugin-device": "1.1.4", "cordova-plugin-splashscreen": "~4.0.1", "cordova-plugin-statusbar": "2.2.1", "cordova-plugin-whitelist": "1.3.1", "ionic-angular": "2.2.0", "ionic-native": "2.4.1", "ionic-plugin-keyboard": "~2.2.1", "ionic-tooltips": "^2.0.0", "ionicons": "3.0.0", "rxjs": "^5.4.2", "sw-toolbox": "3.4.0", "typescript": "2.4.0", "zone.js": "0.7.2" }

Cambios en rxjs y versión mecanografiada.


Hoy, enfrentó este error y lo resolvió prácticamente con los siguientes tres pasos. Entonces, compartir lo mismo con la esperanza, ayudará a otros.

Paso 1: en el archivo package.json, cambie la entrada como "rxjs": "5.4.2",

Paso 2: elimine la carpeta node_modules del proyecto, que está presente en el directorio raíz

Paso 3: Ahora, haga clic con el botón derecho en el archivo package.json y haga clic en restaurar como se muestra a continuación:

Nota: Nuevamente creará la carpeta node_module con los nuevos archivos. Ahora construye la solución, con suerte no deberías obtener ningún error de construcción relacionado con el problema anterior.