2017-03-03 22 views
9
type someType = { 
    keyOne: string, 
    keyTwo: string, 
}; 

type someOtherType = { 
    keyOne: string, 
    keyTwo: string, 
    keyThree: string, 
}; 

Cả hai loại là những vật có chứa keyOnekeyTwo, sự khác biệt duy nhất là sau kéo dài cựu với một chìa khóa thêm keyThree.Lưu lượng: Tạo một kiểu dòng chảy bằng cách mở rộng loại khác

Thay vì viết mã trùng lặp, bạn có thể tạo loại luồng someOtherType bằng cách mở rộng someType không? Trong tâm trí của tôi, ES6 đối tượng còn lại/lây lan đến với tâm trí, nhưng tôi không chắc chắn làm thế nào để thực hiện một cái gì đó như thế này trong Flow.

Cảm ơn!

+1

có thể trùng lặp của [FlowType: Thừa kế các loại (Type A là một tập hợp con của loại B ...)] (http://stackoverflow.com/questions/42281539/flowtype-inheritance-of-types- type-a-is-a-tập con-of-type-b) –

+0

Tuyệt vời, cảm ơn liên kết. –

Trả lời

10

Điều bạn đang tìm kiếm là intersection type. Theo tài liệu:

Loại giao lộ yêu cầu giá trị là tất cả các loại đầu vào.

Cú pháp: Intersection: < loại 1> & < loại 2> ... & < loại n>

Loại giao được thiết kế để mở rộng một loại hiện có và thêm các yêu cầu loại bổ sung cho nó.

type someType = { 
    keyOne: string, 
    keyTwo: string 
} 

type someOtherType = someType & { 
    keyThree: string 
} 

const shouldBeOk: someOtherType = { 
    keyOne: 'biz', 
    keyTwo: 'buzz', 
    keyThree: 'baz', 
} 

const shouldError: someOtherType = { 
    keyOne: 123, 
    keyTwo: 'hello', 
    keyThree: 'world', 
} 

// flow error: 
16: const shouldError: someOtherType = { 
          ^object literal. This type is incompatible with 
8: type someOtherType = someType & { 
         ^object type 

Đối diện lôgic của loại giao lộ là union type. Theo tài liệu:

Loại công đoàn yêu cầu giá trị là một trong các loại đầu vào.

Cú pháp: Union: < type 1> | < loại 2> ... | < loại n>

Ví dụ: bạn có thể sử dụng kiểu kết hợp để tạo một số đếm.

type fooBarBazType = 'foo' | 'bar' | 'baz'; 
const shouldBeOk: fooBarBazType = 'bar'; 

const shouldError: fooBarBazType = 'buzz'; 

4: const shouldError: fooBarBazType = 'buzz'; 
            ^string. This type is incompatible with 
4: const shouldError: fooBarBazType = 'buzz'; 
        ^string enum 
+1

câu trả lời cho "bản sao có thể có" được ghi chú ở trên đã lỗi thời. Các loại giao lộ [đã được triển khai từ ngày 1 tháng 7 năm 2016] (https://flowtype.org/blog/2016/07/01/New-Unions-Intersections.html). – thejohnbackes

+0

Nó không lỗi thời. Trong câu trả lời của tôi trong liên kết đó, tôi đề cập đến các loại giao lộ. Họ làm việc cho hầu hết các trường hợp. Tuy nhiên, chúng có thể dẫn đến các thông báo lỗi lạ và chúng không hoạt động như mong đợi trong một số trường hợp (ví dụ: với các loại chính xác). Sự lây lan kiểu đối tượng sẽ hoạt động tốt hơn cho mục đích này và trên thực tế nó đã hạ cánh ngày hôm qua: https://github.com/facebook/flow/commit/ad443dc92879ae21705d4c61b942ba2f8ad61e4d –

+0

xin lỗi Nat, tôi hiểu lầm. Tôi nghĩ bạn đã nói rằng các loại giao lộ chưa được phát hành. – thejohnbackes

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