Các loại trong cấu trúc đối tượng


122

Điều này

const { foo: IFoo[] } = bar;

và điều này

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

hợp lý sẽ gây ra lỗi.

Và điều này

const { foo: TFoo } = bar;

sẽ chỉ phá hủy TFootài sản.

Làm thế nào có thể chỉ định các kiểu cho các thuộc tính đối tượng bị hủy?


Câu hỏi hay, nhưng dù sao thì nó vẫn không thể suy ra loại từ định nghĩa của bar?

2
Điều này được bảo hiểm khá tốt ở đây .

Nhận xét @ user663031 nên được xóa vì nó gây hiểu lầm.
Sasuke Uchiha

@SasukeUchiha Bài viết không có sẵn, nhưng hầu hết các bài báo có thể được đưa lên googlo theo tiêu đề bài viết. Nó đã được chuyển đến mariusschulz.com/blog/… . Nó thực sự làm sáng tỏ một số điều.
Estus Flask

Đó là hữu ích. Cảm ơn bạn.
Sasuke Uchiha

Câu trả lời:


189

Hóa ra có thể chỉ định kiểu sau :cho toàn bộ mẫu cấu trúc:

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

Trong thực tế, không tốt hơn bất kỳ cũ đơn giản

const foo: IFoo[] = bar.foo;

2
Nhưng {foo}không phải là một giá trị. Nó là cái thường được gọi là "mẫu phân công giải cấu trúc". Những gì bạn đang thấy ở đây thực sự là một tính năng TypeScript đặc biệt cho phép các kiểu được liên kết với các mẫu như vậy.

Thật vậy, nó giống một trường hợp đặc biệt hơn, đặc biệt là so với trường hợp let x, y, z: stringmà dường như chỉ xác định loại cho z. Tôi đã cập nhật câu trả lời.
artem

55

Tôi rõ ràng là hơi muộn đến bữa tiệc, nhưng:

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

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

Các loại thuộc tính nameagephải được suy ra một cách chính xác stringnumbertương ứng.


9
Đó là một trường hợp hiếm khi bạn muốn sử dụng một giao diện cho mỗi lần phá hủy.
RA.

2

Tiếp theo câu hỏi của riêng tôi.

Các kiểu không cần phải được chỉ định cho các thuộc tính đối tượng vì chúng được suy ra từ đối tượng bị hủy.

Xét rằng barđã được nhập đúng, fookiểu sẽ được suy ra:

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

Ngay cả khi barkhông được nhập chính xác ( anyhoặc unknown), loại của nó có thể được khẳng định:

const { foo } = bar as { foo: IFoo[] }; // foo type is IFoo[]
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.