Definitelytyped: Promessa<string>.toEqual não aceita parâmetro de string. Requer também promessa.</string>

Criado em 16 mar. 2017  ·  13Comentários  ·  Fonte: DefinitelyTyped/DefinitelyTyped

  • [x] Tentei usar o pacote @types/2.5.46 e tive problemas.
  • [] Tentei usar a versão estável mais recente do tsc. https://www.npmjs.com/package/typescript
  • [] Tenho uma pergunta que é inadequada para StackOverflow . (Por favor, faça quaisquer perguntas apropriadas lá).
  • [] [Mencione] (https://github.com/blog/821-mention-somebody-they-re-notified) os autores (veja Definitions by: em index.d.ts ) para que eles possam responder .

Em 2.5.45, fui capaz de fazer algo assim:
expect(element(by.id('id')).getAttribute('attr')).toEqual('myValue');
Agora me dá um erro
TS2345:Argument of type '"myValue"' is not assignable to parameter of type 'Expected<Promise<string>>'.

Ele para de reclamar se eu adicionar .toString após getAttribute, mas não tenho certeza se funcionará.

Comentários muito úteis

Até que isso seja corrigido, existem várias soluções alternativas:

  1. Corrija a versão das digitações para
    Isso simplesmente usará a versão de trabalho mais recente.
    Corrigir a versão das tipificações parece se tornar uma prática recomendada, já que as tipificações não podem seguir o SemVer e as alterações na versão secundária podem facilmente interromper sua construção.
    Veja estes problemas:
    https://github.com/DefinitelyTyped/DefinitelyTyped/issues/14579
    https://github.com/DefinitelyTyped/DefinitelyTyped/issues/14569
    https://github.com/DefinitelyTyped/DefinitelyTyped/issues/14338
    https://github.com/DefinitelyTyped/DefinitelyTyped/pull/13994#issuecomment -275949045

  2. Use any como parâmetro genérico para expect
    As novas tipificações ainda permitem que você tenha o comportamento antigo, você só precisa especificar explicitamente que deseja usar any como tipo assim

expect<any>(element(by.id('id')).getAttribute('attr')).toEqual('myValue');
  1. Escreva tipificações para as funções assíncronas expect e adicione-as ao seu projeto
    Esta seria a melhor solução, mas deve ser feita pelo Transferidor
    Provavelmente seria algo como
    // UNTESTED CODE!
    interface AsyncMatchers<T> extends Matchers<Promise<T>> {
        toBe(expected: Expected<T>, expectationFailOutput?: any): boolean;
        toEqual(expected: Expected<T>, expectationFailOutput?: any): boolean;
        toContain(expected: T, expectationFailOutput?: any): boolean;
        not: AsyncMatchers<T>;
    }

Adicione este código em um protractor.d.ts em seu projeto em algum lugar que o compilador TypeScript possa ver e ele deve resolver seus problemas, dada a promessa em expect na verdade, resolve para o tipo fornecido em toEqual

Todos 13 comentários

Sim, este é um grande problema para qualquer pessoa que use transferidor no TypeScript.

Parece que o Jasmine (ou talvez a versão do Protractor do Jasmine se ele o modificar - não tenho certeza?) Apóia a expectativa de uma promessa e, em seguida, o teste do valor resolvido da promessa, sem que o autor do teste tenha que resolver a promessa por conta própria.

Parece que @ lukas-zech-software tornou as correspondências genéricas, o que é muito legal, mas quebra as promessas e a correspondência com os valores resolvidos.

Como já mencionado nos comentários do PR, isso não é nada que a digitação do jasmim possa fazer.

Transferidor estende a funcionalidade, portanto, ele deve fornecer as digitações para isso.
Se fosse alguma digitação para transferidor em DefinitelyTyped, isso teria ocorrido durante os testes, mas não há, então não posso corrigir isso aqui.
Na verdade, o Transferidor não fornece nenhuma tipificação para isso, então eles simplesmente contam com expect aceitando any como parâmetro

Eu dificilmente posso adicionar tipificações para um expect assíncrono que não funcionará no próprio jasmim.
Abra um problema com o transferidor e peça que estendam as digitações de jasmim corretamente.

Até que isso seja corrigido, existem várias soluções alternativas:

  1. Corrija a versão das digitações para
    Isso simplesmente usará a versão de trabalho mais recente.
    Corrigir a versão das tipificações parece se tornar uma prática recomendada, já que as tipificações não podem seguir o SemVer e as alterações na versão secundária podem facilmente interromper sua construção.
    Veja estes problemas:
    https://github.com/DefinitelyTyped/DefinitelyTyped/issues/14579
    https://github.com/DefinitelyTyped/DefinitelyTyped/issues/14569
    https://github.com/DefinitelyTyped/DefinitelyTyped/issues/14338
    https://github.com/DefinitelyTyped/DefinitelyTyped/pull/13994#issuecomment -275949045

  2. Use any como parâmetro genérico para expect
    As novas tipificações ainda permitem que você tenha o comportamento antigo, você só precisa especificar explicitamente que deseja usar any como tipo assim

expect<any>(element(by.id('id')).getAttribute('attr')).toEqual('myValue');
  1. Escreva tipificações para as funções assíncronas expect e adicione-as ao seu projeto
    Esta seria a melhor solução, mas deve ser feita pelo Transferidor
    Provavelmente seria algo como
    // UNTESTED CODE!
    interface AsyncMatchers<T> extends Matchers<Promise<T>> {
        toBe(expected: Expected<T>, expectationFailOutput?: any): boolean;
        toEqual(expected: Expected<T>, expectationFailOutput?: any): boolean;
        toContain(expected: T, expectationFailOutput?: any): boolean;
        not: AsyncMatchers<T>;
    }

Adicione este código em um protractor.d.ts em seu projeto em algum lugar que o compilador TypeScript possa ver e ele deve resolver seus problemas, dada a promessa em expect na verdade, resolve para o tipo fornecido em toEqual

Legal, obrigado por esclarecer isso @ lukas-zech-software. Aprecie as diferentes soluções. Acabei bloqueando as digitações para uma versão anterior por enquanto.

Sugira que isso pode ser fechado.

Usando async / await para "desreferenciar" a promessa funciona.

Por exemplo, em vez de

it('should have header', () => {
    let subject = element(by.css('h1')).isPresent();
    let result  = true;
    expect(subject).toEqual(result);
  });

tem como

it('should have header', async () => {
    let subject = await element(by.css('h1')).isPresent();
    let result  = true;
    expect(subject).toEqual(result);
  });

Espero(
para
Espero(

funcionou para mim

Instalando @types/jasminewd funciona para mim, do link

beforeEach (() => {
página = novo xxx ();
browser.waitForAngularEnabled (false);
});

isso resolve o problema

Para mim, ajustar tsconfig.e2e.json por este comentário funcionou. Meu problema apareceu ao atualizar do Angular 4 para o 5 em um projeto gerenciado pela CLI.
https://github.com/angular/protractor/issues/4176#issuecomment -310610380

Se você pode conviver com a imprecisão, uma solução alternativa diferente parece ser alijar toEqual com a string e pedir, em vez disso, toContain.

instalar @types/jasminewd2 resolveu o problema para mim

Para mim, ajustar tsconfig.e2e.json por este comentário funcionou. Meu problema apareceu ao atualizar do Angular 4 para o 5 em um projeto gerenciado pela CLI.
angular / transferidor # 4176 (comentário)

Instalar @types/jasminewd2 e fazer isso é a resposta correta.

Aviso, instalação de @types/jasminewd2 __IS NOT__ uma resposta correta:

  • jasminewd2 não é necessariamente compatível com tipificações de jasmim para v3, pois tem como alvo jasmim v2
  • o motivo pelo qual funciona é apenas uma coincidência, já que any -d todas as entradas.

A resposta correta é:

  • aguarde o resultado conforme descrito aqui
  • estenda as datilografias de transferidor ou crie um novo pacote de datilografia que estenda adequadamente o jasmim
  • use expectAsync disponível na versão mais recente do jasmim.
Esta página foi útil?
0 / 5 - 0 avaliações

Questões relacionadas

JudeAlquiza picture JudeAlquiza  ·  3Comentários

tyv picture tyv  ·  3Comentários

lilling picture lilling  ·  3Comentários

jbreckmckye picture jbreckmckye  ·  3Comentários

victor-guoyu picture victor-guoyu  ·  3Comentários