2017-04-21 15 views
5

Có cách nào để khai báo một loại trong bản đánh máy 'chiết xuất' loại nội bộ của một mảng không?Làm cách nào để trích xuất một loại từ một mảng trong bản ghi?

Ví dụ:

Hãy nói rằng tôi đã có một cái gì đó như thế này trong codebase của tôi:

type InnerCacheType = Event | User; 

Nhưng không:

export interface Cache { 
    events: Event[], 
    users: User[] 
} 
type CacheType = Event[] | User[]; 

//or maybe: 
// type TypeOfProperty = T[keyof T]; 
// type CacheType = TypeOfProperty<Cache>; 

cái gì đó sẽ tương đương với này Những gì tôi muốn là hãy thử lại theo cách thủ công mỗi khi tôi thêm thứ gì đó vào Cache hoặc CacheType

Điều này có thể thực hiện ở dạng Chữ viết không?

Trả lời

2

Giả sử bạn có thể sử dụng TypeScript 2.1 hoặc cao hơn, nếu không không có cách nào để đạt được những gì bạn đang tìm kiếm.

Ngoài ra, hãy nhớ rằng bạn đang cho rằng tất cả các thuộc tính của giao diện Cache sẽ là mảng. Nếu đây không phải là trường hợp, câu hỏi của bạn trở nên vô nghĩa, vì vậy tôi cũng sẽ đưa ra giả định này.

Nói chung, CacheType có thể được viết như

type CacheType = Cache[typeof Cache]; 

bao gồm bất kỳ tài sản thừa kế. Loại thu được tương đương với Event[] | User[], tuy nhiên việc trích xuất các thành phần mảng từ loại công đoàn như vậy là không khả thi.

Giải pháp đang sử dụng các loại được ánh xạ. Các InnerCacheType bạn đang tìm kiếm có thể được viết như

type InnerCacheType = MappedCacheType[typeof MappedCacheType]; 

nơi

type MappedCacheType = { [P in keyof Cache]: Cache[P][0]; }; 

Trong thực tế, loại cuối cùng là tương đương với

{ events: Event; users: User; } 

Xin lưu ý nguyên cảo mà giữ tên giống nhau như những bản gốc.

Tóm tắt, mà không xem xét trường hợp sử dụng của bạn, cách thể hiện loại thành phần của loại mảng TT[0].

Các vấn đề liên quan