event - typescript angular 6 observable




Erro de rxjs/Subject.d.ts: Classe 'Assunto<T>' incorretamente estende classe base 'Observable<T>' (12)

Adicione "noStrictGenericChecks": true no arquivo tsconfig.json no nó "compilerOptions" como mostrado na imagem abaixo e compile a aplicação. Eu enfrentei o mesmo erro depois de adicionar este erro resolvido.

Extraí o código do modelo de amostra deste tutorial e fiz os dois passos abaixo para começar:

  1. npm install // worked fine and created node_modules folder with all dependencies
  2. npm start // falhou com erro abaixo

    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 '<T, 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'.
      npm ERR! code ELIFECYCLE
      npm ERR! errno 2

Eu vejo isso no sujeito. A declaração de levantamento é como abaixo -

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

E em Observable.ts é definido como abaixo-

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

Nota: - 1. Eu sou novo em Angular2 e tentando me apossar das coisas.

  1. O erro pode ser devido a definições incompatíveis do método de elevação

  2. Eu li através deste segmento github

  3. Se eu precisar instalar uma versão diferente do rxjs, por favor, diga como desinstalar e instalar o rxjs correto.

Edit1: Eu poderia estar um pouco atrasado em responder aqui, mas eu ainda recebo o mesmo erro, mesmo depois de usar o typescript 2.3.4 ou o rxjs 6 alpha . Abaixo está meu package.json,

{
  "name": "angular-quickstart",
  "version": "1.0.0",
  "scripts": {
    "start": "tsc && concurrently \"npm run tsc:w\" \"npm run lite\" ",
    "lite": "lite-server",
    "postinstall": "typings install",
    "tsc": "tsc",
    "tsc:w": "tsc -w",
    "typings": "typings"
  },
  "license": "ISC",
  "dependencies": {
    "@angular/common": "2.0.0",
    "@angular/compiler": "2.0.0",
    "@angular/core": "2.0.0",
    "@angular/forms": "2.0.0",
    "@angular/http": "2.0.0",
    "@angular/platform-browser": "2.0.0",
    "@angular/platform-browser-dynamic": "2.0.0",
    "@angular/router": "3.0.0",
    "@angular/upgrade": "2.0.0",
    "core-js": "^2.4.1",
    "reflect-metadata": "^0.1.3",
    "rxjs": "6.0.0-alpha.0",
    "systemjs": "0.19.27",
    "zone.js": "^0.6.23",
    "angular2-in-memory-web-api": "0.0.20",
    "bootstrap": "^3.3.6"
  },
  "devDependencies": {
    "concurrently": "^2.2.0",
    "lite-server": "^2.2.2",
    "typescript": "2.3.4",
    "typings": "^1.3.2"
  }
}

Agora não precisamos do módulo nativo iônico - precisamos apenas de @ iônico-nativo / núcleo. Corre

npm uninstall ionic-native --save

Ele vai resolver o seu problema ..


Como outros salientaram, esta questão surgiu como consequência da verificação de tipos mais rigorosos de genéricos introduzidos no TypeScript 2.4. Isso expôs uma inconsistência em uma definição de tipo RxJS e, consequentemente, foi corrigido no [email protected] . A solução ideal é apenas atualizar para o 5.4.2.

Se, por algum motivo, você não puder atualizar para a versão 5.4.2, deverá usar a solução de Alan Haddad de aumentar a declaração de tipo para corrigi-lo para seu próprio projeto. Ou seja, adicionar esse snippet ao seu aplicativo:

// TODO: Remove this when RxJS releases a stable version with a correct declaration of `Subject`.
import { Operator } from 'rxjs/Operator';
import { Observable } from 'rxjs/Observable';

declare module 'rxjs/Subject' {
  interface Subject<T> {
    lift<R>(operator: Operator<T, R>): Observable<R>;
  }
}

Sua solução não deixará outros efeitos colaterais e é, portanto, ótima. Alternativamente, as soluções propostas têm mais efeitos colaterais para a configuração do seu projeto e, portanto, são menos ideais:

  • Desative as verificações genéricas mais --noStrictGenericChecks com o sinalizador de compilador --noStrictGenericChecks . Isso, no entanto, o tornará menos rígido para o seu próprio aplicativo, o que você pode fazer, mas pode introduzir definições de tipos inconsistentes, como aconteceu com essa instância do RxJS, que, por sua vez, pode introduzir mais bugs no seu aplicativo.
  • Não verificar os tipos nas bibliotecas com o sinalizador --skipLibCheck definido como true. Isso não é ideal, pois você pode não receber alguns erros de tipo relatados.
  • Atualizando para o RxJS 6 Alpha - dado que há mudanças significativas, isso pode quebrar seu aplicativo de maneiras mal documentadas, já que ele ainda está em alfa. Além disso, se você tiver outras dependências, como o Angular 2+, isso pode não ser uma opção suportada, quebrando a própria estrutura agora ou na linha. O que eu acho que é uma questão ainda mais difícil de resolver.

De acordo com github.com/Microsoft/TypeScript/issues/16593 você precisa atualizar o typescript 2.3.4 ou o rxjs 6 alpha

vá até o arquivo package.json na sua versão atualizada do projeto ou versão rxjs. Exemplo

"typescript": "2.3.4"

npm install

atualização (29/06/2017): -

De acordo com os comentários datilografados "2.4.0" funcionando.


Mantenha a opção noStrictGeneric como verdadeira no arquivo tsconfig.config

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

O RxJS 6 terá essa solução fixa, mas como uma solução temporária, você pode usar a opção de compilador noStrictGenericChecks .

Em tsconfig.json , coloque-o em compilerOptions e configure-o como true.

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

Na linha de comando, é --noStrictGenericChecks .

Por que isso está acontecendo?

O TypeScript 2.4 possui uma alteração de rigor e o Subject não está levantando para o Observable correto. A assinatura realmente deveria ter sido

(operador: Operador) => Observable

Isso será corrigido no RxJS 6.


Sim, o problema foi com o TypeScript 2.4.1 Eu apenas desinstalei isso no painel de controle e funciona para mim como o Visual Studio 2017 já tem isso.


Uma abordagem de band-aid admitida é adicionar o seguinte ao seu arquivo tsconfig.json até que o pessoal do RxJS decida o que deseja fazer sobre o erro ao usar o TypeScript 2.4.1:

"compilerOptions": {

    "skipLibCheck": true,

 }

Vá para o arquivo Package.json e modifique a configuração abaixo

...
  "rxjs": "5.4.1",
  "typescript": "~2.4.0"
...

Vai funcionar


Você pode contornar temporariamente o problema usando o aumento de módulo

O código a seguir resolveu o problema para mim. Depois que o RxJS tiver uma versão estável que não exiba esse problema, ele deve ser removido.

// augmentations.ts
import {Operator} from 'rxjs/Operator';
import {Observable} from 'rxjs/Observable';

// TODO: Remove this when a stable release of RxJS without the bug is available.
declare module 'rxjs/Subject' {
  interface Subject<T> {
    lift<R>(operator: Operator<T, R>): Observable<R>;
  }
}

Embora seja talvez irônico que o próprio RxJS faça uso tão pesado dessa técnica para descrever sua própria forma, ela é geralmente aplicável a uma série de problemas.

Embora existam certamente limites e arestas, parte do que torna essa técnica poderosa é que podemos usá-la para aprimorar as declarações existentes, tornando-as mais seguras sem bifurcar e manter o arquivo inteiro.


apenas adicione

"noStrictGenericChecks": true

para o seu tsconfig.json


reinstalando o rxjs -> npm install rxjs @ 6 rxjs-compat @ 6 --save





rxjs