Saya menyiapkan ruang nama global untuk objek saya dengan secara eksplisit menyetel properti window
.
window.MyNamespace = window.MyNamespace || {};
TypeScript menggarisbawahi MyNamespace
dan mengeluh bahwa:
Properti 'MyNamespace' tidak ada pada nilai ketik 'jendela' apa pun "
Saya dapat membuat kode bekerja dengan mendeklarasikan MyNamespace
sebagai variabel ambient dan menjatuhkan window
explicitness tetapi saya tidak ingin melakukan itu.
declare var MyNamespace: any;
MyNamespace = MyNamespace || {};
Bagaimana saya bisa tetap window
di sana dan membuat TypeScript bahagia?
Sebagai catatan saya merasa lucu bahwa TypeScript mengeluh karena memberitahu saya bahwa itu window
adalah tipe any
yang pasti dapat berisi apa saja.
typescript
joshuapoehl
sumber
sumber
Jawaban:
Baru saja menemukan jawabannya di jawaban pertanyaan StackOverflow lain .
Pada dasarnya Anda perlu memperluas
window
antarmuka yang ada untuk memberi tahu tentang properti baru Anda.sumber
.d.ts
file terpisah . Tidak berfungsi saat digunakan dalam.ts
file yang menggunakan impor dan ekspor itu sendiri. Lihat jawaban ini .declare global { interface Window { ... } }
bekerja dengan naskah 2.5.2, tidak perlu untuk.d.ts
berkas seperti yang disebutkan di ataserror TS1234: An ambient module declaration is only allowed at the top level in a file.
ketika saya meletakkannya di bagian atas file, itu memang memperbaiki kesalahan itu, jadi Anda mungkin harus melakukannya juga.Untuk membuatnya dinamis, cukup gunakan:
sumber
as
sebagai gantinya<>
. Lihat jawaban @ david-boyd di bawah ini .this
-return (<any> this)['something in scope']
/* tslint:disable */
SEBAGAI MACAM-MACAM KHUSUS ^ 3.4.3 SOLUSI INI TANPA KERJA YANG LEBIH LAMA
Atau...
Anda cukup mengetik:
dan Anda tidak akan mendapatkan kesalahan kompilasi dan berfungsi sama seperti mengetik
window.MyNamespace
sumber
window['MyNamespace']()
(cukup tambahkan tanda kurung)Menggunakan TSX? Tidak ada jawaban lain yang bekerja untuk saya.
Inilah yang saya lakukan:
sumber
(<any> window).MyNamespace
sebenarnya<any>
akan ditafsirkan sebagai JSX, bukan tipe pemain.Jawaban yang diterima adalah yang biasa saya gunakan, tetapi dengan TypeScript 0.9. * Tidak lagi berfungsi. Definisi baru dari
Window
antarmuka tampaknya sepenuhnya menggantikan definisi built-in, bukan menambahnya.Saya telah melakukan ini sebagai gantinya:
UPDATE: Dengan TypeScript 0.9.5 jawaban yang diterima berfungsi lagi.
sumber
export default class MyClass{ foo(){ ... } ... }
interface MyWindow extends Window{ mc: MyClass }
declare var window: MyWindow
window.mc = new MyClass()
Kemudian Anda dapat memanggil foo () mis. Dari konsol Alat Dev Chrome sepertimc.foo()
declare var...
setiap file yang Anda butuhkan.Window
fakta sederhana bahwa itu bukan jendela vanila. Hanya menghindari pengecekan tipe atau mencoba menipu TS juga bukan cara untuk melakukannya.Global adalah "jahat" :), saya pikir cara terbaik untuk memiliki portabilitas adalah:
Pertama, Anda mengekspor antarmuka: (mis .: ./custom.window.ts)
Kedua, Anda mengimpor
Jendela var global cor ketiga dengan CustomWindow
Dengan cara ini Anda tidak memiliki garis merah di IDE yang berbeda jika Anda menggunakan dengan atribut objek window yang ada, jadi pada akhirnya coba:
Diuji dengan Script 2.4.x dan terbaru!
sumber
Jika Anda perlu memperluas
window
objek dengan tipe kustom yang mengharuskanimport
Anda dapat menggunakan metode berikut:window.d.ts
Lihat 'Augmentasi Global' di bagian 'Penggabungan Deklarasi' dalam Buku Pegangan: https://www.typescriptlang.org/docs/handbook/declaration-merging.html#global-augmentation
sumber
Bagi mereka yang menggunakan CLI Angular itu mudah:
src / polyfills.ts
my-custom-utils.ts
Jika Anda menggunakan IntelliJ, Anda juga perlu mengubah pengaturan berikut di IDE sebelum pengambilan polyfill baru Anda:
sumber
declare global
adalah triknya, dan jawaban ini tidakSaya tidak perlu melakukan ini terlalu sering, satu-satunya kasus yang saya miliki adalah ketika menggunakan Redux Devtools dengan middleware.
Saya hanya melakukannya:
Atau Anda bisa melakukannya:
let myWindow = window as any;
lalu
myWindow.myProp = 'my value';
sumber
Sebagian besar jawaban lain tidak sempurna.
Saya juga mengalami masalah serupa pagi ini. Saya mencoba begitu banyak "solusi" pada SO, tetapi tidak satupun dari mereka yang tidak menghasilkan kesalahan tipe sama sekali dan memungkinkan pemicu jenis jumping di IDE (webstorm atau vscode).
Akhirnya dari sini
, Saya menemukan solusi yang masuk akal untuk melampirkan mengetik untuk variabel global yang bertindak sebagai antarmuka / kelas dan namespace keduanya .
Contohnya di bawah ini:
Sekarang, kode di atas menggabungkan mengetik namespace
MyNamespace
dan antarmukaMyNamespace
ke variabel globalmyNamespace
(properti jendela).sumber
Setelah menemukan jawaban, saya pikir halaman ini mungkin bisa membantu. https://www.typescriptlang.org/docs/handbook/declaration-merging.html#global-augmentation Tidak yakin tentang sejarah penggabungan deklarasi, tetapi ini menjelaskan mengapa hal berikut bisa bekerja.
sumber
Inilah cara melakukannya, jika Anda menggunakan TypeScript Definition Manager !
Buat
typings/custom/window.d.ts
:Pasang pengetikan khusus Anda:
Selesai, gunakan ! Naskah tidak akan mengeluh lagi:
sumber
typings
dibuat usang dengan Typescript 2.0 (pertengahan 2016), dan telah diarsipkan oleh pemiliknya.Typscript tidak melakukan typecheck pada properti string.
Idealnya, skenario variabel global harus dihindari. Saya menggunakannya kadang-kadang untuk men-debug objek di konsol browser.
sumber
Buat file bernama
global.d.ts
eg/src/@types/global.d.ts
lalu tentukan antarmuka seperti:ref: https://www.typescriptlang.org/docs/handbook/declaration-files/templates/global-d-ts.html
sumber
Jika Anda menggunakan Typecript 3.x, Anda mungkin bisa menghilangkan
declare global
bagian dalam jawaban lain dan alih-alih hanya menggunakan:Ini bekerja dengan saya ketika menggunakan Typecript 3.3, WebPack dan TSLint.
sumber
^3.4.3
. Jawaban ini berhasil untuk saya stackoverflow.com/a/42841166/1114926Untuk referensi (ini adalah jawaban yang benar):
Di dalam
.d.ts
file definisiJika Anda bekerja di browser, Anda menambahkan anggota ke konteks jendela browser dengan membuka kembali antarmuka Window:
Gagasan yang sama untuk NodeJS:
Sekarang Anda mendeklarasikan variabel root (yang sebenarnya akan hidup di jendela atau global)
Kemudian dalam
.ts
file biasa , tetapi diimpor sebagai efek samping, Anda benar-benar menerapkannya:Dan akhirnya menggunakannya di tempat lain dalam basis kode, dengan:
sumber
Buat antarmuka khusus memperluas Window dan menambahkan properti khusus Anda sebagai opsional.
Kemudian, biarkan customWindow yang menggunakan antarmuka kustom, tetapi dihargai dengan jendela asli.
Ini bekerja dengan [email protected].
sumber
Bagi mereka yang ingin mengatur properti yang dihitung atau dinamis pada
window
objek, Anda akan menemukan bahwa tidak mungkin dengandeclare global
metode ini. Untuk memperjelas kasus penggunaan iniAnda mungkin mencoba melakukan sesuatu seperti ini
Namun di atas akan kesalahan. Ini karena dalam naskah, antarmuka tidak bermain dengan baik dengan sifat yang dikomputasi dan akan melempar kesalahan seperti
Untuk menyiasati hal ini, Anda dapat pergi dengan menyarankan casting
window
untuk<any>
sehingga Anda dapat melakukansumber
Menggunakan create-react-app v3.3 Saya menemukan cara termudah untuk mencapai ini adalah dengan memperluas
Window
jenis di yang dihasilkan secara otomatisreact-app-env.d.ts
:sumber
Pertama, Anda perlu mendeklarasikan objek jendela dalam lingkup saat ini.
Karena naskah ingin mengetahui jenis objek.
Karena objek jendela didefinisikan di tempat lain, Anda tidak dapat mendefinisikannya kembali.
Tetapi Anda dapat mendeklarasikannya sebagai berikut: -
Ini tidak akan mendefinisikan ulang objek jendela atau tidak akan membuat variabel lain dengan nama
window
.Ini berarti jendela didefinisikan di tempat lain dan Anda hanya merujuknya dalam ruang lingkup saat ini.
Kemudian Anda dapat merujuk ke objek MyNamespace Anda hanya dengan: -
Atau Anda dapat mengatur properti baru pada
window
objek hanya dengan: -Dan sekarang naskah tidak akan mengeluh.
sumber
window
didefinisikan?Saya ingin menggunakan ini di perpustakaan Angular (6) hari ini dan butuh beberapa saat untuk menyelesaikannya seperti yang diharapkan.
Agar pustaka saya menggunakan deklarasi, saya harus menggunakan
d.ts
ekstensi untuk file yang menyatakan properti baru dari objek global.Jadi pada akhirnya, file tersebut berakhir dengan sesuatu seperti:
/path-to-angular-workspace/angular-workspace/projects/angular-library/src/globals.d.ts
Setelah dibuat, jangan lupa untuk mengeksposnya di blog Anda
public_api.ts
.Itu berhasil untuk saya. Semoga ini membantu.
sumber