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).
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
Komentar yang paling membantu
Cukup gunakan
window.setTimeout
sebagai gantinya.