Jenis dalam perusakan objek

123

Ini

const { foo: IFoo[] } = bar;

dan ini

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

akan menyebabkan kesalahan.

Dan ini

const { foo: TFoo } = bar;

hanya akan merusak TFooproperti.

Bagaimana tipe dapat ditentukan untuk properti objek yang dirusak?

Estus Flask
sumber
Pertanyaan bagus, tapi bukankah itu akan bisa menyimpulkan tipe dari definisi barsih?
2
Ini dibahas dengan cukup baik di sini .
Komentar @ user663031 harus dihapus karena menyesatkan.
Sasuke Uchiha
@SasukeUchiha Artikel tidak tersedia, tetapi sebagian besar artikel dapat dicari di Google menurut judul artikel. Itu dipindahkan ke mariusschulz.com/blog/… . Ini benar-benar menjelaskan.
Estus Flask
Itu sangat membantu. Terima kasih.
Sasuke Uchiha

Jawaban:

191

Ternyata dimungkinkan untuk menentukan jenis setelah :untuk seluruh pola penghancuran:

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

Yang pada kenyataannya tidak lebih baik dari tua biasa

const foo: IFoo[] = bar.foo;
artem
sumber
2
Tapi {foo}bukan nilai. Inilah yang biasanya disebut "pola tugas dekonstruksi". Apa yang Anda lihat di sini sebenarnya adalah fitur TypeScript khusus yang memungkinkan jenis-jenis terkait dengan pola tersebut.
Memang, ini lebih seperti kasus khusus, terutama dibandingkan dengan let x, y, z: stringyang tampaknya hanya menentukan jenis z. Saya memperbarui jawabannya.
artem
55

Saya jelas agak terlambat ke pesta, tapi:

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

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

Jenis properti namedan ageharus disimpulkan dengan benar stringdan numbermasing - masing.

Stephen Paul
sumber
9
Ini adalah kasus yang jarang terjadi ketika Anda ingin menggunakan antarmuka untuk setiap kehancuran.
RA.
2

Sebuah tindak lanjut dari pertanyaan saya sendiri.

Jenis tidak perlu ditentukan untuk properti objek karena disimpulkan dari objek yang dirusak.

Mengingat baritu diketik dengan benar, foojenis akan disimpulkan:

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

Meskipun bartidak diketik dengan benar ( anyatau unknown), tipenya dapat ditegaskan:

const { foo } = bar as { foo: IFoo[] }; // foo type is IFoo[]
Estus Flask
sumber