Nesne yok etme türleri


124

Bu

const { foo: IFoo[] } = bar;

ve bu

const { foo: Array<IFoo> } = bar;

makul ölçüde bir hataya neden olur.

Ve bu

const { foo: TFoo } = bar;

sadece TFoomülke zarar verir .

Bozulmuş nesne özellikleri için türler nasıl belirlenebilir?


Güzel soru, ama baryine de türünün tanımından çıkarılamayacak mı?

2
Bu, burada oldukça iyi ele alınmıştır .

@ User663031 yorumu yanıltıcı olduğu için kaldırılmalıdır.
Sasuke Uchiha

@SasukeUchiha Makale mevcut değil, ancak çoğu makale makale başlığına göre Google'da görüntülenebilir. Mariusschulz.com/blog/… adresine taşındı . Gerçekten biraz ışık tutuyor.
Estus Flask

Bu yardımcı olur. Teşekkür ederim.
Sasuke Uchiha

Yanıtlar:


192

Görünüşe göre :, tüm yıkım modeli için sonraki türü belirtmek mümkün :

const {foo}: {foo: IFoo[]} = bar;

Gerçekte hangisi basit bir eskiden daha iyi değil

const foo: IFoo[] = bar.foo;

2
Ama {foo}bir değer değil. Genellikle "yapısöküm atama modeli" olarak adlandırılan şeydir. Burada gördüğünüz şey aslında türlerin bu tür desenlerle ilişkilendirilmesine izin veren özel bir TypeScript özelliğidir.

Aslında, daha çok özel bir duruma benziyor, özellikle let x, y, z: stringde görünürde zyalnızca türü belirten durumla karşılaştırıldığında . Cevabı güncelledim.
artem

55

Partiye biraz geç kaldım ama:

interface User {
  name: string;
  age: number;
}

const obj: any = { name: 'Johnny', age: 25 };
const { name, age }: User = obj;

Özelliklerinin türleri nameve agedoğru olduğu sonucuna gerekir stringve numbersırasıyla.


9
Her yıkım için bir arayüz kullanmak istediğinizde bu nadir görülen bir durumdur.
RA.

2

Kendi sorumun devamı.

Nesne özellikleri için türlerin belirtilmesine gerek yoktur çünkü yok edilmiş nesneden çıkarılırlar.

barDüzgün yazıldığı düşünüldüğünde , footür çıkarılacaktır:

const bar = { foo: [fooValue], ... }; // bar type is { foo: IFoo[], ... }
...
const { foo } = bar; // foo type is IFoo[]

barDoğru yazılmamış olsa bile ( anyveya unknown), türü iddia edilebilir:

const { foo } = bar as { foo: IFoo[] }; // foo type is IFoo[]
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.