Saya mencoba membentuk string yang dipisahkan koma dari suatu objek,
const data = {"Ticket-1.pdf":"8e6e8255-a6e9-4626-9606-4cd255055f71.pdf","Ticket-2.pdf":"106c3613-d976-4331-ab0c-d581576e7ca1.pdf"};
const values = Object.values(data).map(x => x.substr(0, x.length - 4));
const commaJoinedValues = values.join(',');
console.log(commaJoinedValues);
Bagaimana melakukan ini dengan TypeScript?
mendapatkan file kesalahan:
severity: 'Error'
message: 'Property 'values' does not exist on type 'ObjectConstructor'.'
at: '216,27'
source: 'ts'
typescript
object
pengguna2280016
sumber
sumber
Object.values
di TS untuk menyelesaikan kesalahan kompilasi OP. Untuk melakukan itu, Anda hanya perluES2017
dalam--lib
pengaturan Anda .ES2017
lib, dan harus menyertakan pustaka polyfills di mana menggunakannya. Berikan jawaban yang berbeda terhadap orang yang berbeda adalah rajanya.ES7/Object.values()
. Mungkin Anda berpikir itu rumit (saya tidak setuju), tetapi itu hanya sifat mencoba menggunakan fitur masa depan sepertiObject.values()
saat ini. Selalu seperti ini. BahkanObject.keys()
masih harus di-polyfill jika Anda menargetkan ES3 atau ingin mendukung IE8 (semoga Anda tidak lagi!). Ide yang baik secara umum untuk memahami fitur ES, dukungan browser, dan polyfilling jika Anda dalam pengembangan web!Object.values()
adalah bagian dari ES2017 , dan kesalahan kompilasi yang Anda dapatkan adalah karena Anda perlu mengkonfigurasi TS untuk menggunakan perpustakaan ES2017. Anda mungkin menggunakan pustaka ES6 atau ES5 dalam konfigurasi TS Anda saat ini.Solusi: gunakan
es2017
ataues2017.object
dalam--lib
opsi kompiler Anda .Misalnya, menggunakan
tsconfig.json
:"compilerOptions": { "lib": ["es2017", "dom"] }
Perhatikan bahwa menargetkan ES2017 dengan naskah yang tidak memancarkan polyfills di browser untuk ES2017 (yang berarti memecahkan di atas Anda kompilasi kesalahan, tapi Anda masih bisa menemukan sebuah runtime error karena browser tidak melaksanakan ES2017
Object.values
), itu terserah Anda untuk Polyfill proyek Anda kode sendiri jika Anda mau. Dan karenaObject.values
belum didukung dengan baik oleh semua browser (pada saat tulisan ini dibuat), Anda pasti menginginkan polyfill:core-js
akan melakukan pekerjaan itu .sumber
ES2017
menjadies2017
tetapi AFAIK ini tidak perlu, tetapi saya selalu ingin belajar, apakah ada alasan untuk perubahan?ES2017
,DOM
(huruf besar) tercantum dalamtsc --init
komentar sebagai nilai yang valid dan bekerja dengan benar di compiler, tetapi JSON skema hanya merincies2017
,dom
(huruf kecil) pilihan, sehingga JSON IDE / linter akan benderaES2017
,DOM
sebagai nilai yang tidak valid (meskipun valid). Agak membingungkan.tsc --help
menampilkan huruf kecil meskipunObject.values()
. Dengan kata lain, Anda bisa mengatasi kesalahan kompilasi tetapi masih mengalami kesalahan runtime jika Anda menjalankan di browser yang tidak memilikinyaObject.values()
.Anda dapat menggunakan
Object.values
TypeScript dengan melakukan ini(<any>Object).values(data)
jika karena alasan tertentu Anda tidak dapat memperbarui ke ES7 di tsconfig.sumber
if for some reason you can't update to ES7 in tsconfig
Saya telah meningkatkan target saya
tsconfig.json
untuk mengaktifkan fitur ini di TypeScript{ "compilerOptions": { "target": "es2017", ...... } }
sumber
Dari pada
Object.values(myObject);
menggunakan
Object["values"](myObject);
Dalam contoh kasus Anda:
const values = Object["values"](data).map(x => x.substr(0, x.length - 4));
Ini akan menyembunyikan kesalahan kompiler ts.
sumber
lib
pengaturan untuk mencerminkan bagaimana Anda menggunakannya, tidak sengaja keluar dari kompilator.lib
pengaturannya hanya untuk mendapatkan pemeriksaan jenis yang benar.Saya baru saja mengenai masalah yang tepat ini dengan Angular 6 menggunakan CLI dan ruang kerja untuk membuat perpustakaan menggunakan
ng g library foo
.Dalam kasus saya, masalahnya ada di
tsconfig.lib.json
folder perpustakaan yang tidakes2017
disertakan dilib
bagian tersebut.Siapa pun yang menemukan masalah ini dengan Angular 6 Anda hanya perlu memastikan bahwa Anda memperbarui Anda
tsconfig.lib.json
serta aplikasi Andatsconfig.json
sumber
Memiliki
tslint
konfigurasi aturan saya di sini selalu mengganti barisObject["values"](myObject)
denganObject.values(myObject)
.Dua opsi jika Anda memiliki masalah yang sama:
(Object as any).values(myObject)
atau
/*tslint:disable:no-string-literal*/ `Object["values"](myObject)`
sumber
Object["values"]
?Cara termudah adalah dengan mentransmisikan
Object
keany
, seperti ini:const data = {"Ticket-1.pdf":"8e6e8255-a6e9-4626-9606-4cd255055f71.pdf","Ticket-2.pdf":"106c3613-d976-4331-ab0c-d581576e7ca1.pdf"}; const obj = <any>Object; const values = obj.values(data).map(x => x.substr(0, x.length - 4)); const commaJoinedValues = values.join(','); console.log(commaJoinedValues);
Dan voila - tidak ada kesalahan kompilasi;)
sumber
Lebih sederhana lagi, gunakan
_.values
dari underscore.js https://underscorejs.org/#valuessumber