Definitelytyped: Janji<string>.toEqual tidak menerima parameter string. Membutuhkan juga Janji.</string>

Dibuat pada 16 Mar 2017  ·  13Komentar  ·  Sumber: DefinitelyTyped/DefinitelyTyped

  • [x] Saya mencoba menggunakan paket @types/2.5.46 dan mengalami masalah.
  • [ ] Saya mencoba menggunakan tsc versi stabil terbaru. https://www.npmjs.com/package/typescript
  • [ ] Saya punya pertanyaan yang tidak pantas untuk StackOverflow . (Silakan ajukan pertanyaan yang sesuai di sana).
  • [ ] [Sebutkan](https://github.com/blog/821-mention-somebody-they-re-notified) penulis (lihat Definitions by: di index.d.ts ) sehingga mereka dapat merespons .

Di 2.5.45 saya bisa melakukan sesuatu seperti itu:
expect(element(by.id('id')).getAttribute('attr')).toEqual('myValue');
Sekarang itu memberi saya kesalahan
TS2345:Argument of type '"myValue"' is not assignable to parameter of type 'Expected<Promise<string>>'.

Itu berhenti mengeluh jika saya menambahkan .toString setelah getAttribute tetapi saya tidak yakin itu akan berhasil.

Komentar yang paling membantu

Sampai ini diperbaiki, ada beberapa solusi:

  1. Perbaiki versi pengetikan ke 2.5.45
    Ini hanya akan menggunakan versi kerja terbaru.
    Memperbaiki versi pengetikan tampaknya menjadi praktik terbaik karena pengetikan tidak dapat mengikuti SemVer dan perubahan dalam versi minor dapat dengan mudah merusak build Anda.
    Lihat masalah ini:
    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. Gunakan any sebagai parameter umum untuk expect
    Pengetikan baru masih memungkinkan Anda memiliki perilaku lama, Anda hanya perlu menentukan secara eksplisit bahwa Anda ingin menggunakan any sebagai tipe seperti ini

expect<any>(element(by.id('id')).getAttribute('attr')).toEqual('myValue');
  1. Tulis pengetikan untuk fungsi async expect dan tambahkan ke proyek Anda
    Ini akan menjadi solusi terbaik tetapi harus dilakukan oleh Busur Derajat
    Mungkin akan terlihat seperti
    // 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>;
    }

Tambahkan kode ini dalam protractor.d.ts di proyek Anda di suatu tempat yang dapat dilihat oleh kompiler TypeScript dan itu akan menyelesaikan masalah Anda, mengingat janji di expect sebenarnya menyelesaikan jenis yang disediakan di toEqual

Semua 13 komentar

Ya, ini adalah masalah besar bagi siapa saja yang menggunakan busur derajat di TypeScript.

Tampaknya Jasmine (atau mungkin Jasmine versi Protractor jika memodifikasinya - saya tidak yakin?) mendukung mengharapkan janji dan kemudian menguji nilai yang diselesaikan dari janji, tanpa pembuat tes harus menyelesaikan janji itu sendiri.

Sepertinya @lukas-zech-software membuat kecocokan itu generik, yang sangat keren, tetapi melanggar janji dan mencocokkan dengan nilai yang diselesaikan.

Seperti yang telah disebutkan dalam komentar PR, ini tidak dapat dilakukan oleh pengetikan melati.

Busur derajat memperluas fungsionalitas sehingga harus menyediakan pengetikan untuk ini.
Jika ada pengetikan untuk busur derajat pada PastiTyped ini akan terjadi selama pengujian tetapi tidak ada jadi saya tidak dapat memperbaikinya di sini.
Sebenarnya Protractor tidak menyediakan pengetikan sama sekali untuk ini, jadi mereka hanya mengandalkan expect menerima any sebagai parameter

Saya hampir tidak dapat menambahkan pengetikan untuk async expect yang tidak akan berfungsi di melati itu sendiri.
Silakan buka masalah dengan busur derajat dan minta mereka untuk memperpanjang pengetikan melati dengan benar.

Sampai ini diperbaiki, ada beberapa solusi:

  1. Perbaiki versi pengetikan ke 2.5.45
    Ini hanya akan menggunakan versi kerja terbaru.
    Memperbaiki versi pengetikan tampaknya menjadi praktik terbaik karena pengetikan tidak dapat mengikuti SemVer dan perubahan dalam versi minor dapat dengan mudah merusak build Anda.
    Lihat masalah ini:
    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. Gunakan any sebagai parameter umum untuk expect
    Pengetikan baru masih memungkinkan Anda memiliki perilaku lama, Anda hanya perlu menentukan secara eksplisit bahwa Anda ingin menggunakan any sebagai tipe seperti ini

expect<any>(element(by.id('id')).getAttribute('attr')).toEqual('myValue');
  1. Tulis pengetikan untuk fungsi async expect dan tambahkan ke proyek Anda
    Ini akan menjadi solusi terbaik tetapi harus dilakukan oleh Busur Derajat
    Mungkin akan terlihat seperti
    // 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>;
    }

Tambahkan kode ini dalam protractor.d.ts di proyek Anda di suatu tempat yang dapat dilihat oleh kompiler TypeScript dan itu akan menyelesaikan masalah Anda, mengingat janji di expect sebenarnya menyelesaikan jenis yang disediakan di toEqual

Keren, terima kasih telah menyelesaikan ini @lukas-zech-software. Menghargai solusi yang berbeda. Saya akhirnya mengunci pengetikan ke versi sebelumnya untuk saat ini.

Sarankan ini bisa ditutup.

Menggunakan async/menunggu untuk "dereferensi" janji itu berfungsi.

Misalnya alih-alih

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

memilikinya sebagai

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

mengharapkan(
ke
mengharapkan(

itu berhasil untuk saya

Menginstal @types/jasminewd berfungsi untuk saya, dari tautan

sebelumSetiap(() => {
halaman = baru xxx();
browser.waitForAngularEnabled(salah);
});

ini menyelesaikan masalah

Bagi saya, menyesuaikan tsconfig.e2e.json per komentar ini berhasil. Masalah saya muncul ketika memperbarui dari Angular 4 ke 5 pada proyek yang dikelola CLI.
https://github.com/angular/protractor/issues/4176#issuecomment -310610380

Jika Anda dapat hidup dengan ketidaktepatan, solusi yang berbeda tampaknya membuang toEqual dengan string dan sebagai gantinya meminta toContain.

menginstal @types/jasminewd2 memecahkan masalah untuk saya

Bagi saya, menyesuaikan tsconfig.e2e.json per komentar ini berhasil. Masalah saya muncul ketika memperbarui dari Angular 4 ke 5 pada proyek yang dikelola CLI.
sudut/busur derajat#4176 (komentar)

Menginstal @types/jasminewd2 dan melakukan ini adalah jawaban yang benar.

Perhatikan, pemasangan @types/jasminewd2 __TIDAK__ jawaban yang benar:

  • jasminewd2 belum tentu kompatibel dengan pengetikan melati untuk v3, karena menargetkan melati v2
  • alasan kerjanya hanyalah kebetulan, karena mereka any -d semua input.

Jawaban yang benar adalah:

  • tunggu hasil seperti yang dijelaskan di sini
  • perpanjang pengetikan busur derajat atau buat paket pengetikan baru yang akan memperpanjang melati dengan benar
  • gunakan expectAsync tersedia di melati terbaru.
Apakah halaman ini membantu?
0 / 5 - 0 peringkat