Object.values ​​daktilo ile nasıl kullanılır?


135

Bir nesneden virgülle ayrılmış bir dize oluşturmaya çalışıyorum,

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);

Bunu TypeScript ile nasıl yapabilirim?

hata dosyası alıyorum:

severity: 'Error'
message: 'Property 'values' does not exist on type 'ObjectConstructor'.'
at: '216,27'
source: 'ts'

Yanıtlar:


106

bunun yerine Object.keys kullanın.

const data = {
  a: "first",
  b: "second",
};

const values = Object.keys(data).map(key => data[key]);

const commaJoinedValues = values.join(",");
console.log(commaJoinedValues);

90
Object.valuesOP'nin derleme hatasını çözmek için TS'de ES7'lerin nasıl kullanılacağına dair gerçek bir cevap değil, bunun alternatif (iyi bir tane!) Olduğuna dikkat edin. Sadece ihtiyaç Bunu yapmak için ES2017sizin de --libayara.
Aaron Beall

4
@Aaron çözümünüz o kadar karmaşıktır ki, daktiloda yeni olan herkes kabul edemez, derlemek için ES2017lib eklemeniz gerekir ve bunu kullanan çoklu dolgular kütüphanesi içermelidir. Farklı insanlara karşı farklı cevaplar kraldır.
holi-java

9
@ holi-jave Bu "benim çözümüm" değil, TS'nin ve henüz standart olmayan JS özelliklerinin OP'nin kullanmaya çalıştığı gibi nasıl çalıştığıdır ES7/Object.values(). Belki de karmaşık olduğunu düşünüyorsunuz (katılmıyorum), ama bu sadece Object.values()bugünün gelecekteki özelliklerini kullanmaya çalışmanın doğası . Hep böyle oldu. Object.keys()ES3'ü hedefliyorsanız veya IE8'i desteklemek istiyorsanız bile yine de çoklu doldurulmalıdır (umarım artık yapmazsınız!) Genel olarak ES özelliklerini, tarayıcı desteğini ve web geliştirmesindeyseniz çoklu doldurmayı anlamak iyi bir fikirdir!
Aaron Beall

@Aaron karmaşık olduğunu söylemedim, ancak typescript / javascript için yeni biri için daha karmaşık ve kabul edilmiyor.
holi-java


224

Object.values()olan ES2017 parçası ve ES2017 kütüphane kullanımı yapılandırmak TS gerek çünkü alıyorsanız derleme hatasıdır. Muhtemelen mevcut TS yapılandırmanızda ES6 veya ES5 kütüphanesi kullanıyorsunuz.

Çözüm: kullanım es2017veya es2017.objectsizin içinde --libderleyici seçeneği .

Örneğin, şunu kullanarak tsconfig.json:

"compilerOptions": {
    "lib": ["es2017", "dom"]
}

Typescript ile ES2017 hedef almasının Not gelmez değil ES2017 için tarayıcıda polyfills yayarlar (sizin yukarıdaki çözer anlam derleme hatası, ama yine de bir karşılaşabileceğiniz çalışma zamanı tarayıcı ES2017 uygulamıyor çünkü hata Object.values), bu projeyi polyfill için size kalmış isterseniz kendinizi kodlayın. Ve bu yana Object.valueshenüz de tüm tarayıcılar tarafından desteklenmez kesinlikle bir polyfill istiyorum (bu yazının yazıldığı anda): core-jsedecek bir iş yapmak .


1
@ErikvanVelzen Sen harf değişikliği cevabını düzenlenmiş ES2017için es2017değişiklik için bir sebep ama AFAIK bu necassary değil, ama her zaman öğrenmek istiyorum vardı?
Aaron Beall

2
: ^ Kendi soruya cevap vermek için ES2017, DOMlistelenen (büyük harf) tsc --initgeçerli değerler olarak açıklama ve derleyici düzgün çalışır, ancak JSON şema yalnızca sıralar es2017, domJSON IDE / linter irade bayrağı böylece, (küçük) seçenekleri ES2017, DOMolarak geçersiz değerler (geçerli olsalar bile). Biraz kafa karıştırıcı.
Aaron Beall

Gerçekten de nedeni buydu. Not ettiğiniz gibi büyük harfle çalışır. tsc --helpküçük harf olsa da gösterir
Erik van Velzen

Core-j'ler açısal olarak dahil edilmez, değilse bu polly dolgusu nasıl eklenir?
Samiullah Khan

1
@ Totty.js TS'nin içerdiği kütüphane dosyaları yalnızca tür denetimi içindir , başka bir deyişle, aslında herhangi bir JS kütüphanesi çoklu dolgusu gibi şeyler yayınlamaz Object.values(). Başka bir deyişle derleme hatası etrafında alabilirsiniz ama olmayan bir tarayıcıda çalıştırırsanız yine çalışma zamanı hataları girmek Object.values().
Aaron Beall

18

Sen kullanabilirsiniz Object.valuesyaparak daktilo (<any>Object).values(data)nedense sen tsconfig içinde ES7 güncellemek olamazsa.


4
@Aaron, yayınlandığı sırada Angular'ın belirli bir sürümünü kullanan kişilerin, çalışmadığı yerde lib'i güncelleme konusunda sorunları olduğunu belirten yorumlar vardı. Bu yüzden koydumif for some reason you can't update to ES7 in tsconfig
mtpultz

11

Onun yerine

Object.values(myObject);

kullanım

Object["values"](myObject);

Örnek durumunuzda:

const values = Object["values"](data).map(x => x.substr(0, x.length - 4));

Bu ts derleyici hatasını gizler.


1
sen dahisin (^ - ') b
harufumi.abe

Type 'ObjectConstructor' hayır endeksi signature.ts çünkü Eleman örtük (7017) bir 'herhangi bir' türü vardır
Tyguy7

6
Bu TS'nin yanlış kullanımıdır. Derleyiciyi libbilerek nasıl kullandığınızı yansıtacak şekilde yapılandırmalısınız, derleyiciden bilerek kaçmamalısınız.
Aaron Beall

1
@AaronBeall iyi bir kullanım es2017'ye yükseltemezseniz iyi bir kullanımdır
Dino

@Dino es2017'ye yükseltmenize gerek yok, core- js'yi ES5'e kadar çok dolgu yapmak için kullanabilirsiniz. TypeScript'in çalışma zamanı yok, libayar sadece doğru tip kontrolünü almaktır .
Aaron Beall

11

Yaşıyorum benim, hedef artmıştır tsconfig.jsondaktilo bu özelliği etkinleştirmek için

{
    "compilerOptions": {
        "target": "es2017",
        ......
    }
}

Eski tarayıcılarla uyumluluğu sürdürmek istemeniz durumunda hedefi değiştirmek bir çözüm değildir. Daktilo metni bir ES2017 sözdizimini ES2015'e aktarabilmelidir.
Rastgele

4

Ben sadece bir kütüphane oluşturmak için CLI ve çalışma alanlarını kullanarak Angular 6 ile bu tam sorunu vurmak ng g library foo.

Benim durumumda, sorun bölüme dahil tsconfig.lib.jsonolmayan kütüphane klasöründeydi .es2017lib

Angular 6 ile bu sorunla karşılaşan herkes, sizi tsconfig.lib.jsonve başvurunuzu güncellediğinizden emin olmanız gerekirtsconfig.json


es2017 hem tsconfig.lib hem de tsconfig.json koydum, ancak yine de girişleri kullanmaya çalışırken 'girişleri Nesne üzerinde yok' hatası alıyorum. Değiştirmem / güncellemem gereken başka bir şey var mı?
Maurice

i tsconfig.lib hedef şimdi es2017 olarak değiştirildi, hala aynı hata.
Maurice

2

Benim Having tslinthep hattını değiştirerek burada kurallar yapılandırması Object["values"](myObject)ile Object.values(myObject).

Aynı sorununuz varsa iki seçenek:

(Object as any).values(myObject)

veya

/*tslint:disable:no-string-literal*/
`Object["values"](myObject)`

1
Neden hiç kullanmak istedin Object["values"]?
Aaron Beall

-4

En basit yolu döküm etmektir ObjectTo anyböyle:

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);

Ve voila - derleme hataları yok;)


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.