2016-06-21 23 views
13

Ví dụ, với kỷ lục sau đây:Có thể bọc một loại lưu lượng trong một thùng chứa không thay đổi được không?

type UserRecord = { 
    id: string; 
    name: ?string; 
    age: number; 
} 

Có một số cách để làm điều tương đương với các nội dung sau:

/* @flow */ 

import { List, Map } from 'immutable' 

const users: List<Map<UserRecord>> = List();  
let user: Map<UserRecord>; 

user = Map({ id: '666', age: 30 }); 
users.push(user); 

Nếu tôi kết thúc đơn giản là sử dụng một cái gì đó giống như Map<string, any> mà tôi nghĩ lấy đi từ việc sử dụng Immutable.js với hệ thống kiểu luồng.

+0

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

Trả lời

2

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 đó.

+0

Thật không may là không có bất kỳ điều gì tiết lộ ít hơn cho chúng tôi — cảm ơn vì giải pháp thú vị – gf3

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