Nói chung điều này là không thể vì bản ghi và bản đồ có ngữ nghĩa rất khác nhau. Loại bản đồ được tham số hóa với các loại khóa và giá trị, vì vậy khi bạn gọi .get
, bạn sẽ nhận được cùng một loại cho tất cả các khóa.
Có một con đường xung quanh, mặc dù:
declare class Map<T, K1=null, V1=null, K2=null, V2=null> {
constructor(val: T): void;
get(key: K1 & $Keys<T>): V1;
get(key: K2 & $Keys<T>): V2;
// etc
}
const m: Map<{ foo: string, bar: number }, 'foo', string, 'bar', number> = new Map({
'foo': 'foo',
bar: 42
});
m.get('foo') // string
m.get('bar') // number
m.get('baz') // error
Nó có thể là một ý tưởng tốt để tạo ra tuyên bố như vậy với một số loại kịch bản để hỗ trợ số tiền mong muốn của cặp khóa-giá trị.
Tuyên bố như vậy có một chút tiết, nhưng an toàn nếu bạn không làm hỏng thông số loại. Một vài ý kiến:
chúng tôi sử dụng tính năng dòng chảy gần đây cho phép chúng ta khai báo tham số kiểu mặc định, vì vậy mà chúng ta có thể sử dụng một tuyên bố duy nhất cho bất kỳ số lượng cặp khóa-giá trị;
K1 & $Keys<T>
đảm bảo rằng chúng tôi chỉ có thể sử dụng các khóa thực tế loại T
để truy xuất giá trị; điều này giúp với tính nhất quán ở một mức độ nào đó, thật không may, tôi không tìm thấy cách nào để xác minh tính nhất quán của các loại giá trị, vì vậy bạn phải cẩn thận với những loại đó.
Lưu ý rằng có giao diện lưu lượng WIP immutable.js mà bạn cần phải bao gồm thủ công vào dự án của mình. Tôi không biết liệu nó có hoạt động tốt hay không. Xem https://github.com/facebook/immutable-js/blob/master/type-definitions/immutable.js.flow và https://github.com/facebook/immutable-js/issues/203 – Nikita