Tìm kiếm trang web

Typescript: Kiểu trải rộng chỉ có thể được tạo từ các kiểu đối tượng


function foo<T extends object>(t: T): T {

  return {
    ...t // Error: [ts] Spread types may only be created from object types.
  }
}

Tôi nhận thức được rằng có các vấn đề trên GitHub, nhưng tôi không thể xác định được cái gì đã được sửa và cái gì chưa, và họ có 2695 vấn đề đang mở. Vì vậy, tôi đăng ở đây. Tôi đang sử dụng Typescript 2.9.2 mới nhất.

Nếu mã trên không hoạt động thì sao? Và làm thế nào tôi có thể sửa nó nếu có thể?

Câu trả lời #1

Điều này đã được sửa trong TypeScript phiên bản 3.2. Xem Ghi chú Phát hành.

Có vẻ như spread với một kiểu generic vẫn chưa được hỗ trợ, nhưng có một vấn đề trên GitHub về điều này: Microsoft/TypeScript#10727.

Hiện tại bạn có thể sử dụng khai báo kiểu như @Jevgeni đã bình luận:

function foo<T extends object>(t: T): T {
  return { ...(t as object) } as T;
}

hoặc bạn có thể sử dụng Object.assign vốn có định nghĩa kiểu thích hợp.

function foo<T extends object>(t: T): T {
  return Object.assign({}, t);
}

Câu trả lời #2

Bạn có thể sử dụng Record<string, unknown> hoặc một interface như các ví dụ dưới đây:

goodsArray.map(good => {
  return {
    id: good.payload.doc.id,
    ...(good.payload.doc.data() as Record<string, unknown>)
  };
});

hoặc

goodsArray.map(good => {
  return {
    id: good.payload.doc.id,
    ...good.payload.doc.data() as Goods // 'Goods' is my interface name
  };
});

Câu trả lời #3

Phiên bản 3.2 của Typescript đã sửa lỗi này. Hai PR cải thiện xử lý các tham số spread và rest là:

  • Các biến và tham số phần còn lại của đối tượng tổng quát
  • Các biểu thức spread tổng quát trong các literal đối tượng

Bạn có thể thử ngay bây giờ bằng cách sử dụng npm install [email .

Với 3.2 mã của bạn hoạt động như hiện tại.

Phiên bản 3.2 đã được phát hành vào ngày 29 tháng 11 năm 2018, bạn có thể đọc thêm về nó tại đây.

Bài viết liên quan