Typescript: setTimeout - menetapkan id batas waktu ke variabel membuat kesalahan TS2323: Ketik 'Timer' tidak dapat ditetapkan untuk mengetik 'nomor'.

Dibuat pada 7 Okt 2014  ·  24Komentar  ·  Sumber: microsoft/TypeScript

Menggunakan tsc v1.1.0-1 kami mendapatkan kesalahan saat menyusun:
error TS2323: Ketik 'Timer' tidak dapat ditetapkan untuk mengetik 'nomor'.

kode berikut menampilkan kesalahan kompilasi:

this.sTimeout = setTimeout (() => this.showDelay (), 250);

sTimeout didefinisikan sebagai angka (private var).

Question

Komentar yang paling membantu

Cukup gunakan window.setTimeout sebagai gantinya.

Semua 24 komentar

Silakan posting contoh lengkap. Informasi yang diberikan sejauh ini tidak cukup untuk mereproduksi masalah:

class Foo {
    private sTimeout: number;
    showDelay() { }
    bar() {
        setTimeout(() => this.showDelay(), 250);
    }
}

Tidak ada tipe bawaan yang disebut Timer jadi kemungkinan setTimeout Anda panggil bukan window.setTimeout .

Seharusnya membuat contoh - tadi sedikit terburu-buru. Ini dia:

class Foo {
    private sTimeout: number; // Storing Timeout ID - to clear it - if needed
    private showDelay() { }
    constructor() {
        this.sTimeout = setTimeout(() => this.showDelay(), 250);
    }
}

Melempar kesalahan berikut:

Menggunakan tsc v1.1.0-1
/tests/Foo.ts(5,3): error TS2323: Ketik 'Timer' tidak dapat ditetapkan untuk mengetik 'nomor'.

Untuk saat ini saya telah memperbaikinya menggunakan dengan mengetik sTimeout ke sembarang.

Ini tidak menegurku. Apa yang terjadi jika Anda F12 setTimeout ?

Tidak yakin apa yang Anda maksud dengan F12? .

"Pergi ke definisi"

Sekali lagi, tidak ada tipe bawaan yang disebut Timer , jadi kode Anda harus mengacu pada tipe lain. Silakan coba contoh Anda dalam sebuah file dengan sendirinya, atau cari tahu dari mana dalam proyek Anda Timer ini berasal. Saya menebak bahwa setTimeout tidak mengacu pada fungsi bawaan, melainkan beberapa fungsi yang ditentukan pengguna lainnya yang memiliki nilai pengembalian yang berbeda.

Mencoba contoh itu sendiri: sepertinya ini disebabkan oleh komponen di toolchain saya atau kode lain - maaf telah meluangkan waktu Anda. Terima kasih ... Tutup ...

Untuk pembaca selanjutnya, saya menemukan kesalahan ini karena definisi pasti yang diketik node.js. Solusinya adalah dengan menggunakan nama lengkap dari tipe, yaitu NodeJS.Timer bukan Timer (yang sayangnya disarankan oleh transpiler Typecript, dan tidak berfungsi).

@jdfreder waktu berlalu - masa depan ada di sini

bagaimanapun saya memiliki masalah yang sama: error TS2352: Neither type 'Timer' nor type 'number' is assignable to the other. meskipun saya memiliki referensi implisit yang ditentukan di bagian atas file /// <reference path="node_modules/typescript/lib/lib.d.ts" /> masih tidak berfungsi.

Masalah utamanya adalah salah satu dari paket npm pihak ketiga kami (angular2) memiliki pengetikan TS + (node, dan lainnya) yang disertakan dalam paket.

@rixrix (dan untuk siapa pun yang menemukan ini) Saya memiliki masalah yang sama sampai saya menyadari bahwa saya tidak memberikan parameter yang benar.

Bandingkan ini, yang membutuhkan parameter kedua ms dan mengembalikan NodeJS.Timer :

function setTimeout(callback: (...args: any[]) => void, ms: number, ...args: any[]): NodeJS.Timer;

... dan ini, yang membuat parameter kedua timeout opsional dan mengembalikan number :

function setTimeout(handler: any, timeout?: any, ...args: any[]): number;

Berdasarkan kedua fungsi ini TS dengan benar memilih kelebihan beban yang sesuai, jadi jika Anda mendapatkan error TS2352: Neither type 'Timer' nor type 'number' is assignable to the other pastikan Anda menentukan batas waktu!

Hai @Penryn, terima kasih atas perhatiannya!

Saya pikir komentar saya sebelumnya adalah bukti tidak memberikan cukup detail karena saya tidak dapat mengingat lagi detail yang tepat tentang pesan kesalahan tersebut. Maaf.

Di atas kepala saya, masalah yang kami hadapi sebelumnya adalah saat kami melakukan peningkatan bertahap dari aplikasi web spin off kami yang ditulis dalam Angular2 (rilis alfa). Basis kode utama kami (ng1 dan ng2) ditulis dalam TypeScript (dengan komponen bower, banyak pengetikan lain, dan beberapa pengetikan khusus), dan Angular2 pada saat itu juga mengirim pengetikan, pengetikan node, dll. Dengan pengetikan node kami (ketinggalan jaman versi) dan pengetikan node ng2 (dan mungkin pengetikan lainnya), secara efektif kompilator TS menjadi bingung tentang pengetikan dups. Dalam kasus kami, kami dapat memodifikasi pengetikan yang menyinggung secara manual tetapi itu terlalu merepotkan karena mengetahui bahwa beberapa hal kami harus mengeluarkan versi terbaru

Saya pikir ini telah diselesaikan dalam rilis Angular2 baru-baru ini karena kita harus menginstal pengetikan yang diperlukan secara manual.

Bersulang

@RyanCavanaugh memiliki masalah yang sama. Saya melihat, bahwa saya memiliki dua definisi untuk setTimeout. Satu mengembalikan number dan yang lainnya mengembalikan NodeJS.Timer .

Cukup gunakan window.setTimeout sebagai gantinya.

Mengapa NodeJS.Timer membutuhkan tipe khusus? Ini masih akan mengembalikan number kan? Apakah saya melewatkan sesuatu?

@cchamberlain Node sebenarnya mengembalikan seluruh kelas Timer: https://nodejs.org/api/timers.html

Jadi bukan hanya number dalam kasus ini.

@Penn - TIL 👍

Bagi mereka yang penasaran, alasan ini terjadi adalah karena setTimeout di node.js mengembalikan hal yang berbeda dari setTimeout di dalam browser. SetTimeout browser hanya mengembalikan angka; di node.js setTimeout mengembalikan objek Timer yang besar.

Jadi, alasan Anda melihat masalah ini hampir pasti karena Anda bermaksud menargetkan web, tetapi Anda telah menarik definisi node.

@johnfn juga bisa menjadi kode isomorfik yang ditujukan untuk browser dan node target.

Untuk orang lain yang datang ke sini menggunakan setTimeout atau setInterval , gunakan window.setTimeout atau interval sehingga tsc tahu Anda menggunakan fungsi browser web (yang mengembalikan angka ) dan bukan fungsi NodeJS (yang mengembalikan sesuatu yang lain).

Untuk menambahkan ke @AskYous , jika Anda memiliki @types/node dalam paket, gunakan window.setInterval untuk menghindari kegagalan tipe.

Untuk yang menggunakan @angular dengan @angular-cli pastikan Anda juga memiliki jenis node pada tsconfig.app.json .

Persamaan:

tsconfig.app.json

{
  "extends": "../tsconfig.json",
  "compilerOptions": {
    "outDir": "../out-tsc/app",
    "module": "es6",
    "baseUrl": "",
    "types": ["node"] --> ADD THIS
  },
  "exclude": [
    "test.ts",
    "**/*.spec.ts"
  ]
}

Saya menemukannya di sini: https://stackoverflow.com/a/43952363/3415716

Mungkin Anda telah mengimpor paket yang memiliki fungsi dengan nama setTimeout() .
Cukup gunakan window.setTimeout alih-alih setTimeout untuk menyelesaikan masalah :)

dalam tipe lingkungan node adalah NodeJS.Timer use global.setTimeout
dan dalam jenis lingkungan browser adalah number gunakan window.setTimeout

hari ini setelah menginstal npm i @types/react @types/react-dom --save-dev

@types\node bocor ke node_modules dan dengan demikian menyebabkan kesalahan Timer

Seperti @ nippur72 , saya menemukan ini hari ini dengan react-dom . Saya pikir solusi paling sederhana adalah memperbarui paket @types agar tidak bergantung pada Node ketika lingkungan browser diharapkan, maka: https://github.com/DefinitelyTyped/DefinitelyTyped/issues/21310#issuecomment -367919251

Apakah halaman ini membantu?
0 / 5 - 0 peringkat