Đôi khi rất hữu ích khi tạo một loại là tất cả của một tập hợp các loại khác. Ví dụ: bạn có thể muốn viết một hàm chấp nhận một đối tượng là sự kết hợp của các loại đối tượng khác. Đối với điều này, Flow hỗ trợ các loại giao lộ
1 2 3 4 5 6 7 8 9 10 11 12 13 14
// @flow
type A = { a: number };
type B = { b: boolean };
type C = { c: string };
function method[value: A & B & C] {
// ...
}
// $ExpectError
method[{ a: 1 }]; // Error!
// $ExpectError
method[{ a: 1, b: true }]; // Error!
method[{ a: 1, b: true, c: 'three' }]; // Works!
Không thể gọi `phương thức` với đối tượng bằng chữ được liên kết với `giá trị` vì thuộc tính `b` bị thiếu trong đối tượng bằng chữ [1] nhưng tồn tại trong `B` [2]. [thiếu chỗ dựa] Không thể gọi `phương thức` với đối tượng bằng chữ được liên kết với `giá trị` vì thuộc tính `c` bị thiếu trong đối tượng bằng chữ [1] nhưng tồn tại trong `C` [2]. [thiếu chỗ dựa] Không thể gọi `phương thức` có nghĩa đen đối tượng được liên kết với `giá trị` vì thuộc tính `c` bị thiếu trong nghĩa đen đối tượng [1] nhưng tồn tại trong `C` [2]. [thiếu chỗ dựa]
{"giá trị". "// @flow\ntype A = { a. số };\nloại B = { b. boolean };\nloại C = { c. chuỗi };\in\phương thức hàm[giá trị. A & B & C] {\n //. \n}\n\n// $ExpectError\nmethod[{ a. 1 }]; . \n// $ExpectError\nmethod[{ a. 1, b. thật }]; . \nphương thức[{ một. 1, b. đúng, c. 'số ba' }]; . \n","mã thông báo". [{"loại". "Dòng","bối cảnh". "bình luận","giá trị". "// @flow","dòng". 1, "bắt đầu". 0,"kết thúc". 8},{"loại". "T_TYPE","ngữ cảnh". "giá trị bình thường". "loại","dòng". 2, "bắt đầu". 9,"kết thúc". 13},{"loại". "T_IDENTIFIER","bối cảnh". "loại","giá trị". "A","dòng". 2, "bắt đầu". 14,"kết thúc". 15},{"loại". "T_ASSIGN","ngữ cảnh". "loại","giá trị". "=","dòng". 2, "bắt đầu". 16,"kết thúc". 17},{"loại". "T_LCURLY","ngữ cảnh". "loại","giá trị". "{","dòng". 2, "bắt đầu". 18,"kết thúc". 19},{"loại". "T_IDENTIFIER","bối cảnh". "giá trị bình thường". "a","dòng". 2, "bắt đầu". 20,"kết thúc". 21},{"loại". "T_COLON","bối cảnh". "loại","giá trị". ". ","dòng". 2, "bắt đầu". 21,"kết thúc". 22},{"loại". "T_NUMBER_TYPE","ngữ cảnh". "loại","giá trị". "số","dòng". 2, "bắt đầu". 23,"kết thúc". 29},{"loại". "T_RCURLY","ngữ cảnh". "loại","giá trị". "}","dòng". 2, "bắt đầu". 30,"kết thúc". 31},{"loại". "T_SEMICOLON","bối cảnh". "giá trị bình thường". ";","dòng". 2, "bắt đầu". 31,"kết thúc". 32},{"loại". "T_TYPE","ngữ cảnh". "giá trị bình thường". "loại","dòng". 3, "bắt đầu". 33,"kết thúc". 37},{"loại". "T_IDENTIFIER","bối cảnh". "loại","giá trị". "B","dòng". 3, "bắt đầu". 38,"kết thúc". 39},{"loại". "T_ASSIGN","ngữ cảnh". "loại","giá trị". "=","dòng". 3, "bắt đầu". 40,"kết thúc". 41},{"loại". "T_LCURLY","ngữ cảnh". "loại","giá trị". "{","dòng". 3, "bắt đầu". 42,"kết thúc". 43},{"loại". "T_IDENTIFIER","bối cảnh". "giá trị bình thường". "b","dòng". 3, "bắt đầu". 44,"kết thúc". 45},{"loại". "T_COLON","bối cảnh". "loại","giá trị". ". ","dòng". 3, "bắt đầu". 45,"kết thúc". 46},{"loại". "T_BOOLEAN_TYPE","bối cảnh". "loại","giá trị". "boolean","dòng". 3, "bắt đầu". 47,"kết thúc". 54},{"loại". "T_RCURLY","ngữ cảnh". "loại","giá trị". "}","dòng". 3, "bắt đầu". 55,"kết thúc". 56},{"loại". "T_SEMICOLON","bối cảnh". "giá trị bình thường". ";","dòng". 3, "bắt đầu". 56,"kết thúc". 57},{"loại". "T_TYPE","ngữ cảnh". "giá trị bình thường". "loại","dòng". 4, "bắt đầu". 58,"kết thúc". 62},{"loại". "T_IDENTIFIER","bối cảnh". "loại","giá trị". "C","dòng". 4, "bắt đầu". 63,"kết thúc". 64},{"loại". "T_ASSIGN","ngữ cảnh". "loại","giá trị". "=","dòng". 4, "bắt đầu". 65,"kết thúc". 66},{"loại". "T_LCURLY","ngữ cảnh". "loại","giá trị". "{","dòng". 4, "bắt đầu". 67,"kết thúc". 68},{"loại". "T_IDENTIFIER","bối cảnh". "giá trị bình thường". "c","dòng". 4, "bắt đầu". 69,"kết thúc". 70},{"loại". "T_COLON","bối cảnh". "loại","giá trị". ". ","dòng". 4, "bắt đầu". 70,"kết thúc". 71},{"loại". "T_STRING_TYPE","ngữ cảnh". "loại","giá trị". "chuỗi","dòng". 4, "bắt đầu". 72,"kết thúc". 78},{"loại". "T_RCURLY","ngữ cảnh". "loại","giá trị". "}","dòng". 4, "bắt đầu". 79,"kết thúc". 80},{"loại". "T_SEMICOLON","bối cảnh". "giá trị bình thường". ";","dòng". 4, "bắt đầu". 80,"kết thúc". 81},{"loại". "T_FUNCTION","bối cảnh". "giá trị bình thường". "chức năng","dòng". 6, "bắt đầu". 83,"kết thúc". 91},{"loại". "T_IDENTIFIER","bối cảnh". "giá trị bình thường". "phương pháp","dòng". 6, "bắt đầu". 92,"kết thúc". 98},{"loại". "T_LPAREN","bối cảnh". "giá trị bình thường". "[","dòng". 6, "bắt đầu". 98,"kết thúc". 99},{"loại". "T_IDENTIFIER","bối cảnh". "giá trị bình thường". "giá trị","dòng". 6, "bắt đầu". 99,"kết thúc". 104},{"loại". "T_COLON","bối cảnh". "loại","giá trị". ". ","dòng". 6, "bắt đầu". 104,"kết thúc". 105},{"loại". "T_IDENTIFIER","bối cảnh". "loại","giá trị". "A","dòng". 6, "bắt đầu". 106,"kết thúc". 107},{"loại". "T_BIT_AND","ngữ cảnh". "loại","giá trị". "&","dòng". 6, "bắt đầu". 108,"kết thúc". 109},{"loại". "T_IDENTIFIER","bối cảnh". "loại","giá trị". "B","dòng". 6, "bắt đầu". 110,"kết thúc". 111},{"loại". "T_BIT_AND","ngữ cảnh". "loại","giá trị". "&","dòng". 6, "bắt đầu". 112,"kết thúc". 113},{"loại". "T_IDENTIFIER","bối cảnh". "loại","giá trị". "C","dòng". 6, "bắt đầu". 114,"kết thúc". 115},{"loại". "T_RPAREN","bối cảnh". "giá trị bình thường". "]","dòng". 6, "bắt đầu". 115,"kết thúc". 116},{"loại". "T_LCURLY","ngữ cảnh". "giá trị bình thường". "{","dòng". 6, "bắt đầu". 117,"kết thúc". 118},{"loại". "Dòng","bối cảnh". "bình luận","giá trị". "//. ","dòng". 7, "bắt đầu". 121,"kết thúc". 127},{"loại". "T_RCURLY","ngữ cảnh". "giá trị bình thường". "}","dòng". 8,"bắt đầu". 128,"kết thúc". 129},{"loại". "Dòng","bối cảnh". "bình luận","giá trị". "// $ExpectError","dòng". 10,"bắt đầu". 131,"kết thúc". 146},{"loại". "T_IDENTIFIER","bối cảnh". "giá trị bình thường". "phương pháp","dòng". 11,"bắt đầu". 147,"kết thúc". 153},{"loại". "T_LPAREN","bối cảnh". "giá trị bình thường". "[","dòng". 11,"bắt đầu". 153,"kết thúc". 154},{"loại". "T_LCURLY","ngữ cảnh". "giá trị bình thường". "{","dòng". 11,"bắt đầu". 154,"kết thúc". 155},{"loại". "T_IDENTIFIER","bối cảnh". "giá trị bình thường". "a","dòng". 11,"bắt đầu". 156,"kết thúc". 157},{"loại". "T_COLON","bối cảnh". "giá trị bình thường". ". ","dòng". 11,"bắt đầu". 157,"kết thúc". 158},{"loại". "T_NUMBER","ngữ cảnh". "giá trị bình thường". "1","dòng". 11,"bắt đầu". 159,"kết thúc". 160},{"loại". "T_RCURLY","ngữ cảnh". "giá trị bình thường". "}","dòng". 11,"bắt đầu". 161,"kết thúc". 162},{"loại". "T_RPAREN","bối cảnh". "giá trị bình thường". "]","dòng". 11,"bắt đầu". 162,"kết thúc". 163},{"loại". "T_SEMICOLON","bối cảnh". "giá trị bình thường". ";","dòng". 11,"bắt đầu". 163,"kết thúc". 164},{"loại". "Dòng","bối cảnh". "bình luận","giá trị". "// Lỗi. ","dòng". 11,"bắt đầu". 165,"kết thúc". 174},{"loại". "Dòng","bối cảnh". "bình luận","giá trị". "// $ExpectError","dòng". 12,"bắt đầu". 175,"kết thúc". 190},{"loại". "T_IDENTIFIER","bối cảnh". "giá trị bình thường". "phương pháp","dòng". 13,"bắt đầu". 191,"kết thúc". 197},{"loại". "T_LPAREN","bối cảnh". "giá trị bình thường". "[","dòng". 13,"bắt đầu". 197,"kết thúc". 198},{"loại". "T_LCURLY","ngữ cảnh". "giá trị bình thường". "{","dòng". 13,"bắt đầu". 198,"kết thúc". 199},{"loại". "T_IDENTIFIER","bối cảnh". "giá trị bình thường". "a","dòng". 13,"bắt đầu". 200,"kết thúc". 201},{"loại". "T_COLON","bối cảnh". "giá trị bình thường". ". ","dòng". 13,"bắt đầu". 201,"kết thúc". 202},{"loại". "T_NUMBER","ngữ cảnh". "giá trị bình thường". "1","dòng". 13,"bắt đầu". 203,"kết thúc". 204},{"loại". "T_COMMA","bối cảnh". "giá trị bình thường". ",","dòng". 13,"bắt đầu". 204,"kết thúc". 205},{"loại". "T_IDENTIFIER","bối cảnh". "giá trị bình thường". "b","dòng". 13,"bắt đầu". 206,"kết thúc". 207},{"loại". "T_COLON","bối cảnh". "giá trị bình thường". ". ","dòng". 13,"bắt đầu". 207,"kết thúc". 208},{"loại". "T_TRUE","bối cảnh". "giá trị bình thường". "true","dòng". 13,"bắt đầu". 209,"kết thúc". 213},{"loại". "T_RCURLY","ngữ cảnh". "giá trị bình thường". "}","dòng". 13,"bắt đầu". 214,"kết thúc". 215},{"loại". "T_RPAREN","bối cảnh". "giá trị bình thường". "]","dòng". 13,"bắt đầu". 215,"kết thúc". 216},{"loại". "T_SEMICOLON","bối cảnh". "giá trị bình thường". ";","dòng". 13,"bắt đầu". 216,"kết thúc". 217},{"loại". "Dòng","bối cảnh". "bình luận","giá trị". "// Lỗi. ","dòng". 13,"bắt đầu". 218,"kết thúc". 227},{"loại". "T_IDENTIFIER","bối cảnh". "giá trị bình thường". "phương pháp","dòng". 14,"bắt đầu". 228,"kết thúc". 234},{"loại". "T_LPAREN","bối cảnh". "giá trị bình thường". "[","dòng". 14,"bắt đầu". 234,"kết thúc". 235},{"loại". "T_LCURLY","ngữ cảnh". "giá trị bình thường". "{","dòng". 14,"bắt đầu". 235,"kết thúc". 236},{"loại". "T_IDENTIFIER","bối cảnh". "giá trị bình thường". "a","dòng". 14,"bắt đầu". 237,"kết thúc". 238},{"loại". "T_COLON","bối cảnh". "giá trị bình thường". ". ","dòng". 14,"bắt đầu". 238,"kết thúc". 239},{"loại". "T_NUMBER","ngữ cảnh". "giá trị bình thường". "1","dòng". 14,"bắt đầu". 240,"kết thúc". 241},{"loại". "T_COMMA","bối cảnh". "giá trị bình thường". ",","dòng". 14,"bắt đầu". 241,"kết thúc". 242},{"loại". "T_IDENTIFIER","bối cảnh". "giá trị bình thường". "b","dòng". 14,"bắt đầu". 243,"kết thúc". 244},{"loại". "T_COLON","bối cảnh". "giá trị bình thường". ". ","dòng". 14,"bắt đầu". 244,"kết thúc". 245},{"loại". "T_TRUE","bối cảnh". "giá trị bình thường". "true","dòng". 14,"bắt đầu". 246,"kết thúc". 250},{"loại". "T_COMMA","bối cảnh". "giá trị bình thường". ",","dòng". 14,"bắt đầu". 250,"kết thúc". 251},{"loại". "T_IDENTIFIER","bối cảnh". "giá trị bình thường". "c","dòng". 14,"bắt đầu". 252,"kết thúc". 253},{"loại". "T_COLON","bối cảnh". "giá trị bình thường". ". ","dòng". 14,"bắt đầu". 253,"kết thúc". 254},{"loại". "T_STRING","ngữ cảnh". "giá trị bình thường". "'ba'","dòng". 14,"bắt đầu". 255,"kết thúc". 262},{"loại". "T_RCURLY","ngữ cảnh". "giá trị bình thường". "}","dòng". 14,"bắt đầu". 263,"kết thúc". 264},{"loại". "T_RPAREN","bối cảnh". "giá trị bình thường". "]","dòng". 14,"bắt đầu". 264,"kết thúc". 265},{"loại". "T_SEMICOLON","bối cảnh". "giá trị bình thường". ";","dòng". 14,"bắt đầu". 265,"kết thúc". 266},{"loại". "Dòng","bối cảnh". "bình luận","giá trị". "// Làm. ","dòng". 14,"bắt đầu". 267,"kết thúc". 276}],"lỗi". [{"Tôi". "E1","tin nhắn". [{"Tôi". "E1M1","mô tả". "Không thể gọi `phương thức` có nghĩa đen của đối tượng được liên kết với `giá trị` vì thuộc tính `b` bị thiếu trong nghĩa đen của đối tượng [1] nhưng tồn tại trong `B` [2]. [thiếu chỗ dựa]","bối cảnh". "phương pháp [{a. 1 }]; . ","nguồn". "-","bắt đầu". {"dòng". 11,"cột". 8,"bù đắp". 154},"kết thúc". {"dòng". 11,"cột". 15,"bù đắp". 162}}],"hoạt động". null},{"id". "E2","tin nhắn". [{"Tôi". "E2M1","mô tả". "Không thể gọi `phương thức` với đối tượng bằng chữ được liên kết với `giá trị` vì thuộc tính `c` bị thiếu trong đối tượng bằng chữ [1] nhưng tồn tại trong `C` [2]. [thiếu chỗ dựa]","bối cảnh". "phương pháp [{a. 1 }]; . ","nguồn". "-","bắt đầu". {"dòng". 11,"cột". 8,"bù đắp". 154},"kết thúc". {"dòng". 11,"cột". 15,"bù đắp". 162}}],"hoạt động". null},{"id". "E3","tin nhắn". [{"Tôi". "E3M1","mô tả". "Không thể gọi `phương thức` với đối tượng bằng chữ được liên kết với `giá trị` vì thuộc tính `c` bị thiếu trong đối tượng bằng chữ [1] nhưng tồn tại trong `C` [2]. [thiếu chỗ dựa]","bối cảnh". "phương pháp [{a. 1, b. thật }]; . ","nguồn". "-","bắt đầu". {"dòng". 13,"cột". 8,"bù đắp". 198},"kết thúc". {"dòng". 13,"cột". 24,"bù đắp". 215}}],"hoạt động". vô giá trị}]}
Cú pháp loại giao lộ
Các loại giao lộ là bất kỳ số loại nào được nối với nhau bằng dấu và
14
1
Type1 & Type2 & ... & TypeN
{"giá trị". "Loại 1 & Loại 2 &. & TypeN\n","mã thông báo". [{"loại". "T_IDENTIFIER","bối cảnh". "giá trị bình thường". "Type1","dòng". 1, "bắt đầu". 0,"kết thúc". 5},{"loại". "T_BIT_AND","ngữ cảnh". "giá trị bình thường". "&","dòng". 1, "bắt đầu". 6,"kết thúc". 7},{"loại". "T_IDENTIFIER","bối cảnh". "giá trị bình thường". "Type2","dòng". 1, "bắt đầu". 8,"kết thúc". 13},{"loại". "T_BIT_AND","ngữ cảnh". "giá trị bình thường". "&","dòng". 1, "bắt đầu". 14,"kết thúc". 15},{"loại". "T_ELLIPSIS","ngữ cảnh". "giá trị bình thường". ". ","dòng". 1, "bắt đầu". 16,"kết thúc". 19},{"loại". "T_BIT_AND","ngữ cảnh". "giá trị bình thường". "&","dòng". 1, "bắt đầu". 20,"kết thúc". 21},{"loại". "T_IDENTIFIER","bối cảnh". "giá trị bình thường". "TypeN","dòng". 1, "bắt đầu". 22,"kết thúc". 27}],"lỗi". []}
Bạn cũng có thể thêm dấu và ở đầu, hữu ích khi ngắt các loại giao lộ trên nhiều dòng
1 2 3 4 5
type Foo =
& Type1
& Type2
& ...
& TypeN
{"giá trị". "nhập Foo =\n & Type1\n & Type2\n &. \n & TypeN\n","mã thông báo". [{"loại". "T_TYPE","ngữ cảnh". "giá trị bình thường". "loại","dòng". 1, "bắt đầu". 0,"kết thúc". 4},{"loại". "T_IDENTIFIER","bối cảnh". "loại","giá trị". "Foo","dòng". 1, "bắt đầu". 5, "kết thúc". 8},{"loại". "T_ASSIGN","ngữ cảnh". "loại","giá trị". "=","dòng". 1, "bắt đầu". 9,"kết thúc". 10},{"loại". "T_BIT_AND","ngữ cảnh". "loại","giá trị". "&","dòng". 2, "bắt đầu". 13,"kết thúc". 14},{"loại". "T_IDENTIFIER","bối cảnh". "loại","giá trị". "Type1","dòng". 2, "bắt đầu". 15,"kết thúc". 20},{"loại". "T_BIT_AND","ngữ cảnh". "loại","giá trị". "&","dòng". 3, "bắt đầu". 23,"kết thúc". 24},{"loại". "T_IDENTIFIER","bối cảnh". "loại","giá trị". "Type2","dòng". 3, "bắt đầu". 25,"kết thúc". 30},{"loại". "T_BIT_AND","ngữ cảnh". "loại","giá trị". "&","dòng". 4, "bắt đầu". 33,"kết thúc". 34},{"loại". "T_ELLIPSIS","ngữ cảnh". "giá trị bình thường". ". ","dòng". 4, "bắt đầu". 35,"kết thúc". 38},{"loại". "T_BIT_AND","ngữ cảnh". "giá trị bình thường". "&","dòng". 5, "bắt đầu". 41,"kết thúc". 42},{"loại". "T_IDENTIFIER","bối cảnh". "giá trị bình thường". "TypeN","dòng". 5, "bắt đầu". 43,"kết thúc". 48}],"lỗi". []}
Mỗi thành viên của một loại giao lộ có thể là bất kỳ loại nào, thậm chí là một loại giao lộ khác
1 2 3 4
type Foo = Type1 & Type2;
type Bar = Type3 & Type4;
type Baz = Foo & Bar;
{"giá trị". "nhập Foo = Type1 & Type2;\ntype Bar = Type3 & Type4;\n\ntype Baz = Foo & Bar;\n","mã thông báo". [{"loại". "T_TYPE","ngữ cảnh". "giá trị bình thường". "loại","dòng". 1, "bắt đầu". 0,"kết thúc". 4},{"loại". "T_IDENTIFIER","bối cảnh". "loại","giá trị". "Foo","dòng". 1, "bắt đầu". 5, "kết thúc". 8},{"loại". "T_ASSIGN","ngữ cảnh". "loại","giá trị". "=","dòng". 1, "bắt đầu". 9,"kết thúc". 10},{"loại". "T_IDENTIFIER","bối cảnh". "loại","giá trị". "Type1","dòng". 1, "bắt đầu". 11,"kết thúc". 16},{"loại". "T_BIT_AND","ngữ cảnh". "loại","giá trị". "&","dòng". 1, "bắt đầu". 17,"kết thúc". 18},{"loại". "T_IDENTIFIER","bối cảnh". "loại","giá trị". "Type2","dòng". 1, "bắt đầu". 19,"kết thúc". 24},{"loại". "T_SEMICOLON","bối cảnh". "giá trị bình thường". ";","dòng". 1, "bắt đầu". 24,"kết thúc". 25},{"loại". "T_TYPE","ngữ cảnh". "giá trị bình thường". "loại","dòng". 2, "bắt đầu". 26,"kết thúc". 30},{"loại". "T_IDENTIFIER","bối cảnh". "loại","giá trị". "Thanh","dòng". 2, "bắt đầu". 31,"kết thúc". 34},{"loại". "T_ASSIGN","ngữ cảnh". "loại","giá trị". "=","dòng". 2, "bắt đầu". 35,"kết thúc". 36},{"loại". "T_IDENTIFIER","bối cảnh". "loại","giá trị". "Type3","dòng". 2, "bắt đầu". 37,"kết thúc". 42},{"loại". "T_BIT_AND","ngữ cảnh". "loại","giá trị". "&","dòng". 2, "bắt đầu". 43,"kết thúc". 44},{"loại". "T_IDENTIFIER","bối cảnh". "loại","giá trị". "Type4","dòng". 2, "bắt đầu". 45,"kết thúc". 50},{"loại". "T_SEMICOLON","bối cảnh". "giá trị bình thường". ";","dòng". 2, "bắt đầu". 50,"kết thúc". 51},{"loại". "T_TYPE","ngữ cảnh". "giá trị bình thường". "loại","dòng". 4, "bắt đầu". 53,"kết thúc". 57},{"loại". "T_IDENTIFIER","bối cảnh". "loại","giá trị". "Baz","dòng". 4, "bắt đầu". 58,"kết thúc". 61},{"loại". "T_ASSIGN","ngữ cảnh". "loại","giá trị". "=","dòng". 4, "bắt đầu". 62,"kết thúc". 63},{"loại". "T_IDENTIFIER","bối cảnh". "loại","giá trị". "Foo","dòng". 4, "bắt đầu". 64,"kết thúc". 67},{"loại". "T_BIT_AND","ngữ cảnh". "loại","giá trị". "&","dòng". 4, "bắt đầu". 68,"kết thúc". 69},{"loại". "T_IDENTIFIER","bối cảnh". "loại","giá trị". "Thanh","dòng". 4, "bắt đầu". 70,"kết thúc". 73},{"loại". "T_SEMICOLON","bối cảnh". "giá trị bình thường". ";","dòng". 4, "bắt đầu". 73,"kết thúc". 74}],"lỗi". []}
Các loại giao lộ yêu cầu tất cả vào, nhưng một ra
Các loại giao lộ trái ngược với các loại liên kết. Khi gọi một hàm chấp nhận một loại giao lộ, chúng ta phải truyền vào tất cả các loại đó. Nhưng bên trong chức năng của chúng tôi, chúng tôi chỉ phải coi nó là bất kỳ loại nào trong số đó
1 2 3 4 5 6 7 8 9 10
// @flow
type A = { a: number };
type B = { b: boolean };
type C = { c: string };
function method[value: A & B & C] {
// ...
}
// $ExpectError
method[{ a: 1 }]; // Error!
// $ExpectError
method[{ a: 1, b: true }]; // Error!
method[{ a: 1, b: true, c: 'three' }]; // Works!
0{"giá trị". "// @flow\ntype A = { a. số };\nloại B = { b. boolean };\nloại C = { c. chuỗi };\in\phương thức hàm[giá trị. A & B & C] {\n var a. A = giá trị;\n var b. B = giá trị;\n var c. C = value;\n}\n","token". [{"loại". "Dòng","bối cảnh". "bình luận","giá trị". "// @flow","dòng". 1, "bắt đầu". 0,"kết thúc". 8},{"loại". "T_TYPE","ngữ cảnh". "giá trị bình thường". "loại","dòng". 2, "bắt đầu". 9,"kết thúc". 13},{"loại". "T_IDENTIFIER","bối cảnh". "loại","giá trị". "A","dòng". 2, "bắt đầu". 14,"kết thúc". 15},{"loại". "T_ASSIGN","ngữ cảnh". "loại","giá trị". "=","dòng". 2, "bắt đầu". 16,"kết thúc". 17},{"loại". "T_LCURLY","ngữ cảnh". "loại","giá trị". "{","dòng". 2, "bắt đầu". 18,"kết thúc". 19},{"loại". "T_IDENTIFIER","bối cảnh". "giá trị bình thường". "a","dòng". 2, "bắt đầu". 20,"kết thúc". 21},{"loại". "T_COLON","bối cảnh". "loại","giá trị". ". ","dòng". 2, "bắt đầu". 21,"kết thúc". 22},{"loại". "T_NUMBER_TYPE","ngữ cảnh". "loại","giá trị". "số","dòng". 2, "bắt đầu". 23,"kết thúc". 29},{"loại". "T_RCURLY","ngữ cảnh". "loại","giá trị". "}","dòng". 2, "bắt đầu". 30,"kết thúc". 31},{"loại". "T_SEMICOLON","bối cảnh". "giá trị bình thường". ";","dòng". 2, "bắt đầu". 31,"kết thúc". 32},{"loại". "T_TYPE","ngữ cảnh". "giá trị bình thường". "loại","dòng". 3, "bắt đầu". 33,"kết thúc". 37},{"loại". "T_IDENTIFIER","bối cảnh". "loại","giá trị". "B","dòng". 3, "bắt đầu". 38,"kết thúc". 39},{"loại". "T_ASSIGN","ngữ cảnh". "loại","giá trị". "=","dòng". 3, "bắt đầu". 40,"kết thúc". 41},{"loại". "T_LCURLY","ngữ cảnh". "loại","giá trị". "{","dòng". 3, "bắt đầu". 42,"kết thúc". 43},{"loại". "T_IDENTIFIER","bối cảnh". "giá trị bình thường". "b","dòng". 3, "bắt đầu". 44,"kết thúc". 45},{"loại". "T_COLON","bối cảnh". "loại","giá trị". ". ","dòng". 3, "bắt đầu". 45,"kết thúc". 46},{"loại". "T_BOOLEAN_TYPE","bối cảnh". "loại","giá trị". "boolean","dòng". 3, "bắt đầu". 47,"kết thúc". 54},{"loại". "T_RCURLY","ngữ cảnh". "loại","giá trị". "}","dòng". 3, "bắt đầu". 55,"kết thúc". 56},{"loại". "T_SEMICOLON","bối cảnh". "giá trị bình thường". ";","dòng". 3, "bắt đầu". 56,"kết thúc". 57},{"loại". "T_TYPE","ngữ cảnh". "giá trị bình thường". "loại","dòng". 4, "bắt đầu". 58,"kết thúc". 62},{"loại". "T_IDENTIFIER","bối cảnh". "loại","giá trị". "C","dòng". 4, "bắt đầu". 63,"kết thúc". 64},{"loại". "T_ASSIGN","ngữ cảnh". "loại","giá trị". "=","dòng". 4, "bắt đầu". 65,"kết thúc". 66},{"loại". "T_LCURLY","ngữ cảnh". "loại","giá trị". "{","dòng". 4, "bắt đầu". 67,"kết thúc". 68},{"loại". "T_IDENTIFIER","bối cảnh". "giá trị bình thường". "c","dòng". 4, "bắt đầu". 69,"kết thúc". 70},{"loại". "T_COLON","bối cảnh". "loại","giá trị". ". ","dòng". 4, "bắt đầu". 70,"kết thúc". 71},{"loại". "T_STRING_TYPE","ngữ cảnh". "loại","giá trị". "chuỗi","dòng". 4, "bắt đầu". 72,"kết thúc". 78},{"loại". "T_RCURLY","ngữ cảnh". "loại","giá trị". "}","dòng". 4, "bắt đầu". 79,"kết thúc". 80},{"loại". "T_SEMICOLON","bối cảnh". "giá trị bình thường". ";","dòng". 4, "bắt đầu". 80,"kết thúc". 81},{"loại". "T_FUNCTION","bối cảnh". "giá trị bình thường". "chức năng","dòng". 6, "bắt đầu". 83,"kết thúc". 91},{"loại". "T_IDENTIFIER","bối cảnh". "giá trị bình thường". "phương pháp","dòng". 6, "bắt đầu". 92,"kết thúc". 98},{"loại". "T_LPAREN","bối cảnh". "giá trị bình thường". "[","dòng". 6, "bắt đầu". 98,"kết thúc". 99},{"loại". "T_IDENTIFIER","bối cảnh". "giá trị bình thường". "giá trị","dòng". 6, "bắt đầu". 99,"kết thúc". 104},{"loại". "T_COLON","bối cảnh". "loại","giá trị". ". ","dòng". 6, "bắt đầu". 104,"kết thúc". 105},{"loại". "T_IDENTIFIER","bối cảnh". "loại","giá trị". "A","dòng". 6, "bắt đầu". 106,"kết thúc". 107},{"loại". "T_BIT_AND","ngữ cảnh". "loại","giá trị". "&","dòng". 6, "bắt đầu". 108,"kết thúc". 109},{"loại". "T_IDENTIFIER","bối cảnh". "loại","giá trị". "B","dòng". 6, "bắt đầu". 110,"kết thúc". 111},{"loại". "T_BIT_AND","ngữ cảnh". "loại","giá trị". "&","dòng". 6, "bắt đầu". 112,"kết thúc". 113},{"loại". "T_IDENTIFIER","bối cảnh". "loại","giá trị". "C","dòng". 6, "bắt đầu". 114,"kết thúc". 115},{"loại". "T_RPAREN","bối cảnh". "giá trị bình thường". "]","dòng". 6, "bắt đầu". 115,"kết thúc". 116},{"loại". "T_LCURLY","ngữ cảnh". "giá trị bình thường". "{","dòng". 6, "bắt đầu". 117,"kết thúc". 118},{"loại". "T_VAR","ngữ cảnh". "giá trị bình thường". "var","dòng". 7, "bắt đầu". 121,"kết thúc". 124},{"loại". "T_IDENTIFIER","bối cảnh". "giá trị bình thường". "a","dòng". 7, "bắt đầu". 125,"kết thúc". 126},{"loại". "T_COLON","bối cảnh". "loại","giá trị". ". ","dòng". 7, "bắt đầu". 126,"kết thúc". 127},{"loại". "T_IDENTIFIER","bối cảnh". "loại","giá trị". "A","dòng". 7, "bắt đầu". 128,"kết thúc". 129},{"loại". "T_ASSIGN","ngữ cảnh". "giá trị bình thường". "=","dòng". 7, "bắt đầu". 130,"kết thúc". 131},{"loại". "T_IDENTIFIER","bối cảnh". "giá trị bình thường". "giá trị","dòng". 7, "bắt đầu". 132,"kết thúc". 137},{"loại". "T_SEMICOLON","bối cảnh". "giá trị bình thường". ";","dòng". 7, "bắt đầu". 137,"kết thúc". 138},{"loại". "T_VAR","ngữ cảnh". "giá trị bình thường". "var","dòng". 8,"bắt đầu". 141,"kết thúc". 144},{"loại". "T_IDENTIFIER","bối cảnh". "giá trị bình thường". "b","dòng". 8,"bắt đầu". 145,"kết thúc". 146},{"loại". "T_COLON","bối cảnh". "loại","giá trị". ". ","dòng". 8,"bắt đầu". 146,"kết thúc". 147},{"loại". "T_IDENTIFIER","bối cảnh". "loại","giá trị". "B","dòng". 8,"bắt đầu". 148,"kết thúc". 149},{"loại". "T_ASSIGN","ngữ cảnh". "giá trị bình thường". "=","dòng". 8,"bắt đầu". 150,"kết thúc". 151},{"loại". "T_IDENTIFIER","bối cảnh". "giá trị bình thường". "giá trị","dòng". 8,"bắt đầu". 152,"kết thúc". 157},{"loại". "T_SEMICOLON","bối cảnh". "giá trị bình thường". ";","dòng". 8,"bắt đầu". 157,"kết thúc". 158},{"loại". "T_VAR","ngữ cảnh". "giá trị bình thường". "var","dòng". 9,"bắt đầu". 161,"kết thúc". 164},{"loại". "T_IDENTIFIER","bối cảnh". "giá trị bình thường". "c","dòng". 9,"bắt đầu". 165,"kết thúc". 166},{"loại". "T_COLON","bối cảnh". "loại","giá trị". ". ","dòng". 9,"bắt đầu". 166,"kết thúc". 167},{"loại". "T_IDENTIFIER","bối cảnh". "loại","giá trị". "C","dòng". 9,"bắt đầu". 168,"kết thúc". 169},{"loại". "T_ASSIGN","ngữ cảnh". "giá trị bình thường". "=","dòng". 9,"bắt đầu". 170,"kết thúc". 171},{"loại". "T_IDENTIFIER","bối cảnh". "giá trị bình thường". "giá trị","dòng". 9,"bắt đầu". 172,"kết thúc". 177},{"loại". "T_SEMICOLON","bối cảnh". "giá trị bình thường". ";","dòng". 9,"bắt đầu". 177,"kết thúc". 178},{"loại". "T_RCURLY","ngữ cảnh". "giá trị bình thường". "}","dòng". 10,"bắt đầu". 179,"kết thúc". 180}],"lỗi". []}
Ngay cả khi chúng tôi coi giá trị của mình chỉ là một trong các loại, chúng tôi không gặp lỗi vì nó thỏa mãn tất cả chúng
Giao lộ của các loại chức năng
Một cách sử dụng phổ biến của các loại giao lộ là để biểu thị các hàm trả về các kết quả khác nhau dựa trên đầu vào mà chúng ta chuyển vào. Ví dụ, giả sử rằng chúng ta muốn viết loại hàm mà
- trả về một chuỗi, khi chúng ta chuyển vào giá trị
1
5, - trả về một số, khi chúng ta chuyển vào giá trị
1
6 và - trả về bất kỳ loại nào có thể [
1
7], khi chúng tôi chuyển vào bất kỳ chuỗi nào khác
Loại chức năng này sẽ là
1 2 3 4
// @flow
type A = { a: number };
type B = { b: boolean };
type C = { c: string };
function method[value: A & B & C] {
// ...
}
// $ExpectError
method[{ a: 1 }]; // Error!
// $ExpectError
method[{ a: 1, b: true }]; // Error!
method[{ a: 1, b: true, c: 'three' }]; // Works!
1{"giá trị". "nhập Fn =\n & [[x. \"chuỗi\"] => chuỗi]\n & [[x. \"số\"] => số]\n & [[x. string] => null];\n","token". [{"loại". "T_TYPE","ngữ cảnh". "giá trị bình thường". "loại","dòng". 1, "bắt đầu". 0,"kết thúc". 4},{"loại". "T_IDENTIFIER","bối cảnh". "loại","giá trị". "Fn","dòng". 1, "bắt đầu". 5, "kết thúc". 7},{"loại". "T_ASSIGN","ngữ cảnh". "loại","giá trị". "=","dòng". 1, "bắt đầu". 8,"kết thúc". 9},{"loại". "T_BIT_AND","ngữ cảnh". "loại","giá trị". "&","dòng". 2, "bắt đầu". 12,"kết thúc". 13},{"loại". "T_LPAREN","bối cảnh". "loại","giá trị". "[","dòng". 2, "bắt đầu". 14,"kết thúc". 15},{"loại". "T_LPAREN","bối cảnh". "loại","giá trị". "[","dòng". 2, "bắt đầu". 15,"kết thúc". 16},{"loại". "T_IDENTIFIER","bối cảnh". "giá trị bình thường". "x","dòng". 2, "bắt đầu". 16,"kết thúc". 17},{"loại". "T_COLON","bối cảnh". "loại","giá trị". ". ","dòng". 2, "bắt đầu". 17,"kết thúc". 18},{"loại". "T_STRING","ngữ cảnh". "loại","giá trị". "\"chuỗi\"","dòng". 2, "bắt đầu". 19,"kết thúc". 27},{"loại". "T_RPAREN","bối cảnh". "loại","giá trị". "]","dòng". 2, "bắt đầu". 27,"kết thúc". 28},{"loại". "T_ARROW","bối cảnh". "loại","giá trị". "=>","dòng". 2, "bắt đầu". 29,"kết thúc". 31},{"loại". "T_STRING_TYPE","ngữ cảnh". "loại","giá trị". "chuỗi","dòng". 2, "bắt đầu". 32,"kết thúc". 38},{"loại". "T_RPAREN","bối cảnh". "loại","giá trị". "]","dòng". 2, "bắt đầu". 38,"kết thúc". 39},{"loại". "T_BIT_AND","ngữ cảnh". "loại","giá trị". "&","dòng". 3, "bắt đầu". 42,"kết thúc". 43},{"loại". "T_LPAREN","bối cảnh". "loại","giá trị". "[","dòng". 3, "bắt đầu". 44,"kết thúc". 45},{"loại". "T_LPAREN","bối cảnh". "loại","giá trị". "[","dòng". 3, "bắt đầu". 45,"kết thúc". 46},{"loại". "T_IDENTIFIER","bối cảnh". "giá trị bình thường". "x","dòng". 3, "bắt đầu". 46,"kết thúc". 47},{"loại". "T_COLON","bối cảnh". "loại","giá trị". ". ","dòng". 3, "bắt đầu". 47,"kết thúc". 48},{"loại". "T_STRING","ngữ cảnh". "loại","giá trị". "\"số\"","dòng". 3, "bắt đầu". 49,"kết thúc". 57},{"loại". "T_RPAREN","bối cảnh". "loại","giá trị". "]","dòng". 3, "bắt đầu". 57,"kết thúc". 58},{"loại". "T_ARROW","bối cảnh". "loại","giá trị". "=>","dòng". 3, "bắt đầu". 59,"kết thúc". 61},{"loại". "T_NUMBER_TYPE","ngữ cảnh". "loại","giá trị". "số","dòng". 3, "bắt đầu". 62,"kết thúc". 68},{"loại". "T_RPAREN","bối cảnh". "loại","giá trị". "]","dòng". 3, "bắt đầu". 68,"kết thúc". 69},{"loại". "T_BIT_AND","ngữ cảnh". "loại","giá trị". "&","dòng". 4, "bắt đầu". 72,"kết thúc". 73},{"loại". "T_LPAREN","bối cảnh". "loại","giá trị". "[","dòng". 4, "bắt đầu". 74,"kết thúc". 75},{"loại". "T_LPAREN","bối cảnh". "loại","giá trị". "[","dòng". 4, "bắt đầu". 75,"kết thúc". 76},{"loại". "T_IDENTIFIER","bối cảnh". "giá trị bình thường". "x","dòng". 4, "bắt đầu". 76,"kết thúc". 77},{"loại". "T_COLON","bối cảnh". "loại","giá trị". ". ","dòng". 4, "bắt đầu". 77,"kết thúc". 78},{"loại". "T_STRING_TYPE","ngữ cảnh". "loại","giá trị". "chuỗi","dòng". 4, "bắt đầu". 79,"kết thúc". 85},{"loại". "T_RPAREN","bối cảnh". "loại","giá trị". "]","dòng". 4, "bắt đầu". 85,"kết thúc". 86},{"loại". "T_ARROW","bối cảnh". "loại","giá trị". "=>","dòng". 4, "bắt đầu". 87,"kết thúc". 89},{"loại". "T_NULL","bối cảnh". "loại","giá trị". "null","dòng". 4, "bắt đầu". 90,"kết thúc". 94},{"loại". "T_RPAREN","bối cảnh". "loại","giá trị". "]","dòng". 4, "bắt đầu". 94,"kết thúc". 95},{"loại". "T_SEMICOLON","bối cảnh". "giá trị bình thường". ";","dòng". 4, "bắt đầu". 95,"kết thúc". 96}],"lỗi". []}
Mỗi dòng trong định nghĩa trên được gọi là quá tải và chúng tôi nói rằng các hàm loại
18 bị quá tải
Lưu ý việc sử dụng dấu ngoặc đơn xung quanh các loại mũi tên. Đây là những thứ cần thiết để ghi đè quyền ưu tiên của hàm tạo "mũi tên" trên giao lộ
Gọi một chức năng quá tải
Sử dụng định nghĩa trên, chúng ta có thể khai báo một hàm
19 có hành vi sau
1 2 3 4
// @flow
type A = { a: number };
type B = { b: boolean };
type C = { c: string };
function method[value: A & B & C] {
// ...
}
// $ExpectError
method[{ a: 1 }]; // Error!
// $ExpectError
method[{ a: 1, b: true }]; // Error!
method[{ a: 1, b: true, c: 'three' }]; // Works!
3{"giá trị". "khai báo var fn. Fn;\nvar n. chuỗi = fn[\"chuỗi\"]; . số = fn[\"số\"]; . boolean = fn[\"boolean\"]; . null không tương thích với số\n","mã thông báo". [{"loại". "T_DECLARE","bối cảnh". "giá trị bình thường". "khai báo","dòng". 1, "bắt đầu". 0,"kết thúc". 7},{"loại". "T_VAR","ngữ cảnh". "giá trị bình thường". "var","dòng". 1, "bắt đầu". 8,"kết thúc". 11},{"loại". "T_IDENTIFIER","bối cảnh". "giá trị bình thường". "fn","dòng". 1, "bắt đầu". 12,"kết thúc". 14},{"loại". "T_COLON","bối cảnh". "loại","giá trị". ". ","dòng". 1, "bắt đầu". 14,"kết thúc". 15},{"loại". "T_IDENTIFIER","bối cảnh". "loại","giá trị". "Fn","dòng". 1, "bắt đầu". 16,"kết thúc". 18},{"loại". "T_SEMICOLON","bối cảnh". "giá trị bình thường". ";","dòng". 1, "bắt đầu". 18,"kết thúc". 19},{"loại". "T_VAR","ngữ cảnh". "giá trị bình thường". "var","dòng". 2, "bắt đầu". 20,"kết thúc". 23},{"loại". "T_IDENTIFIER","bối cảnh". "giá trị bình thường". "n","dòng". 2, "bắt đầu". 24,"kết thúc". 25},{"loại". "T_COLON","bối cảnh". "loại","giá trị". ". ","dòng". 2, "bắt đầu". 25,"kết thúc". 26},{"loại". "T_STRING_TYPE","ngữ cảnh". "loại","giá trị". "chuỗi","dòng". 2, "bắt đầu". 27,"kết thúc". 33},{"loại". "T_ASSIGN","ngữ cảnh". "giá trị bình thường". "=","dòng". 2, "bắt đầu". 34,"kết thúc". 35},{"loại". "T_IDENTIFIER","bối cảnh". "giá trị bình thường". "fn","dòng". 2, "bắt đầu". 36,"kết thúc". 38},{"loại". "T_LPAREN","bối cảnh". "giá trị bình thường". "[","dòng". 2, "bắt đầu". 38,"kết thúc". 39},{"loại". "T_STRING","ngữ cảnh". "giá trị bình thường". "\"chuỗi\"","dòng". 2, "bắt đầu". 39,"kết thúc". 47},{"loại". "T_RPAREN","bối cảnh". "giá trị bình thường". "]","dòng". 2, "bắt đầu". 47,"kết thúc". 48},{"loại". "T_SEMICOLON","bối cảnh". "giá trị bình thường". ";","dòng". 2, "bắt đầu". 48,"kết thúc". 49},{"loại". "Dòng","bối cảnh". "bình luận","giá trị". "// được","dòng". 2, "bắt đầu". 50,"kết thúc". 57},{"loại". "T_VAR","ngữ cảnh". "giá trị bình thường". "var","dòng". 3, "bắt đầu". 58,"kết thúc". 61},{"loại". "T_IDENTIFIER","bối cảnh". "giá trị bình thường". "n","dòng". 3, "bắt đầu". 62,"kết thúc". 63},{"loại". "T_COLON","bối cảnh". "loại","giá trị". ". ","dòng". 3, "bắt đầu". 63,"kết thúc". 64},{"loại". "T_NUMBER_TYPE","ngữ cảnh". "loại","giá trị". "số","dòng". 3, "bắt đầu". 65,"kết thúc". 71},{"loại". "T_ASSIGN","ngữ cảnh". "giá trị bình thường". "=","dòng". 3, "bắt đầu". 72,"kết thúc". 73},{"loại". "T_IDENTIFIER","bối cảnh". "giá trị bình thường". "fn","dòng". 3, "bắt đầu". 74,"kết thúc". 76},{"loại". "T_LPAREN","bối cảnh". "giá trị bình thường". "[","dòng". 3, "bắt đầu". 76,"kết thúc". 77},{"loại". "T_STRING","ngữ cảnh". "giá trị bình thường". "\"số\"","dòng". 3, "bắt đầu". 77,"kết thúc". 85},{"loại". "T_RPAREN","bối cảnh". "giá trị bình thường". "]","dòng". 3, "bắt đầu". 85,"kết thúc". 86},{"loại". "T_SEMICOLON","bối cảnh". "giá trị bình thường". ";","dòng". 3, "bắt đầu". 86,"kết thúc". 87},{"loại". "Dòng","bối cảnh". "bình luận","giá trị". "// được","dòng". 3, "bắt đầu". 88,"kết thúc". 95},{"loại". "T_VAR","ngữ cảnh". "giá trị bình thường". "var","dòng". 4, "bắt đầu". 96,"kết thúc". 99},{"loại". "T_IDENTIFIER","bối cảnh". "giá trị bình thường". "n","dòng". 4, "bắt đầu". 100,"kết thúc". 101},{"loại". "T_COLON","bối cảnh". "loại","giá trị". ". ","dòng". 4, "bắt đầu". 101,"kết thúc". 102},{"loại". "T_BOOLEAN_TYPE","bối cảnh". "loại","giá trị". "boolean","dòng". 4, "bắt đầu". 103,"kết thúc". 110},{"loại". "T_ASSIGN","ngữ cảnh". "giá trị bình thường". "=","dòng". 4, "bắt đầu". 111,"kết thúc". 112},{"loại". "T_IDENTIFIER","bối cảnh". "giá trị bình thường". "fn","dòng". 4, "bắt đầu". 113,"kết thúc". 115},{"loại". "T_LPAREN","bối cảnh". "giá trị bình thường". "[","dòng". 4, "bắt đầu". 115,"kết thúc". 116},{"loại". "T_STRING","ngữ cảnh". "giá trị bình thường". "\"boolean\"","dòng". 4, "bắt đầu". 116,"kết thúc". 125},{"loại". "T_RPAREN","bối cảnh". "giá trị bình thường". "]","dòng". 4, "bắt đầu". 125,"kết thúc". 126},{"loại". "T_SEMICOLON","bối cảnh". "giá trị bình thường". ";","dòng". 4, "bắt đầu". 126,"kết thúc". 127},{"loại". "Dòng","bối cảnh". "bình luận","giá trị". "// lỗi. null không tương thích với số","dòng". 4, "bắt đầu". 128,"kết thúc". 170}],"lỗi". []}
Flow đạt được hành vi này bằng cách khớp loại đối số với lần quá tải đầu tiên với loại tham số tương thích. Ví dụ, lưu ý rằng đối số
15 khớp với cả quá tải đầu tiên và quá tải cuối cùng. Flow sẽ chỉ chọn cái đầu tiên. Nếu không có tình trạng quá tải nào phù hợp, Flow sẽ phát sinh lỗi tại vị trí cuộc gọi
Khai báo các hàm quá tải
Một cách tương đương để khai báo cùng hàm
19 là sử dụng các câu lệnh “khai báo hàm” liên tiếp
// @flow
type A = { a: number };
type B = { b: boolean };
type C = { c: string };
function method[value: A & B & C] {
// ...
}
// $ExpectError
method[{ a: 1 }]; // Error!
// $ExpectError
method[{ a: 1, b: true }]; // Error!
method[{ a: 1, b: true, c: 'three' }]; // Works!
4// @flow
type A = { a: number };
type B = { b: boolean };
type C = { c: string };
function method[value: A & B & C] {
// ...
}
// $ExpectError
method[{ a: 1 }]; // Error!
// $ExpectError
method[{ a: 1, b: true }]; // Error!
method[{ a: 1, b: true, c: 'three' }]; // Works!
5{"giá trị". "khai báo hàm fn[x. \"chuỗi\"]. string;\nkhai báo hàm fn[x. \"con số\"]. số;\nkhai báo hàm fn[x. chuỗi]. null;\n","mã thông báo". [{"loại". "T_DECLARE","bối cảnh". "giá trị bình thường". "khai báo","dòng". 1, "bắt đầu". 0,"kết thúc". 7},{"loại". "T_FUNCTION","bối cảnh". "giá trị bình thường". "chức năng","dòng". 1, "bắt đầu". 8,"kết thúc". 16},{"loại". "T_IDENTIFIER","bối cảnh". "giá trị bình thường". "fn","dòng". 1, "bắt đầu". 17,"kết thúc". 19},{"loại". "T_LPAREN","bối cảnh". "loại","giá trị". "[","dòng". 1, "bắt đầu". 19,"kết thúc". 20},{"loại". "T_IDENTIFIER","bối cảnh". "giá trị bình thường". "x","dòng". 1, "bắt đầu". 20,"kết thúc". 21},{"loại". "T_COLON","bối cảnh". "loại","giá trị". ". ","dòng". 1, "bắt đầu". 21,"kết thúc". 22},{"loại". "T_STRING","ngữ cảnh". "loại","giá trị". "\"chuỗi\"","dòng". 1, "bắt đầu". 23,"kết thúc". 31},{"loại". "T_RPAREN","bối cảnh". "loại","giá trị". "]","dòng". 1, "bắt đầu". 31,"kết thúc". 32},{"loại". "T_COLON","bối cảnh". "giá trị bình thường". ". ","dòng". 1, "bắt đầu". 32,"kết thúc". 33},{"loại". "T_STRING_TYPE","ngữ cảnh". "loại","giá trị". "chuỗi","dòng". 1, "bắt đầu". 34,"kết thúc". 40},{"loại". "T_SEMICOLON","bối cảnh". "giá trị bình thường". ";","dòng". 1, "bắt đầu". 40,"kết thúc". 41},{"loại". "T_DECLARE","bối cảnh". "giá trị bình thường". "khai báo","dòng". 2, "bắt đầu". 42,"kết thúc". 49},{"loại". "T_FUNCTION","bối cảnh". "giá trị bình thường". "chức năng","dòng". 2, "bắt đầu". 50,"kết thúc". 58},{"loại". "T_IDENTIFIER","bối cảnh". "giá trị bình thường". "fn","dòng". 2, "bắt đầu". 59,"kết thúc". 61},{"loại". "T_LPAREN","bối cảnh". "loại","giá trị". "[","dòng". 2, "bắt đầu". 61,"kết thúc". 62},{"loại". "T_IDENTIFIER","bối cảnh". "giá trị bình thường". "x","dòng". 2, "bắt đầu". 62,"kết thúc". 63},{"loại". "T_COLON","bối cảnh". "loại","giá trị". ". ","dòng". 2, "bắt đầu". 63,"kết thúc". 64},{"loại". "T_STRING","ngữ cảnh". "loại","giá trị". "\"số\"","dòng". 2, "bắt đầu". 65,"kết thúc". 73},{"loại". "T_RPAREN","bối cảnh". "loại","giá trị". "]","dòng". 2, "bắt đầu". 73,"kết thúc". 74},{"loại". "T_COLON","bối cảnh". "giá trị bình thường". ". ","dòng". 2, "bắt đầu". 74,"kết thúc". 75},{"loại". "T_NUMBER_TYPE","ngữ cảnh". "loại","giá trị". "số","dòng". 2, "bắt đầu". 76,"kết thúc". 82},{"loại". "T_SEMICOLON","bối cảnh". "giá trị bình thường". ";","dòng". 2, "bắt đầu". 82,"kết thúc". 83},{"loại". "T_DECLARE","bối cảnh". "giá trị bình thường". "khai báo","dòng". 3, "bắt đầu". 84,"kết thúc". 91},{"loại". "T_FUNCTION","bối cảnh". "giá trị bình thường". "chức năng","dòng". 3, "bắt đầu". 92,"kết thúc". 100},{"loại". "T_IDENTIFIER","bối cảnh". "giá trị bình thường". "fn","dòng". 3, "bắt đầu". 101,"kết thúc". 103},{"loại". "T_LPAREN","bối cảnh". "loại","giá trị". "[","dòng". 3, "bắt đầu". 103,"kết thúc". 104},{"loại". "T_IDENTIFIER","bối cảnh". "giá trị bình thường". "x","dòng". 3, "bắt đầu". 104,"kết thúc". 105},{"loại". "T_COLON","bối cảnh". "loại","giá trị". ". ","dòng". 3, "bắt đầu". 105,"kết thúc". 106},{"loại". "T_STRING_TYPE","ngữ cảnh". "loại","giá trị". "chuỗi","dòng". 3, "bắt đầu". 107,"kết thúc". 113},{"loại". "T_RPAREN","bối cảnh". "loại","giá trị". "]","dòng". 3, "bắt đầu". 113,"kết thúc". 114},{"loại". "T_COLON","bối cảnh". "giá trị bình thường". ". ","dòng". 3, "bắt đầu". 114,"kết thúc". 115},{"loại". "T_NULL","bối cảnh". "loại","giá trị". "null","dòng". 3, "bắt đầu". 116,"kết thúc". 120},{"loại". "T_SEMICOLON","bối cảnh". "giá trị bình thường". ";","dòng". 3, "bắt đầu". 120,"kết thúc". 121}],"lỗi". []}
Một hạn chế trong Flow là nó không thể kiểm tra phần thân của hàm đối với loại giao lộ. Nói cách khác, nếu chúng tôi cung cấp triển khai sau cho
19 ngay sau các khai báo trên
1 2 3 4 5
// @flow
type A = { a: number };
type B = { b: boolean };
type C = { c: string };
function method[value: A & B & C] {
// ...
}
// $ExpectError
method[{ a: 1 }]; // Error!
// $ExpectError
method[{ a: 1, b: true }]; // Error!
method[{ a: 1, b: true, c: 'three' }]; // Works!
7{"giá trị". "function fn[x] {\n if [x === \"string\"] { return \"\"; }\n other if [x === \"number\"] { return 0; }\ . [{"loại". "T_FUNCTION","bối cảnh". "giá trị bình thường". "chức năng","dòng". 1, "bắt đầu". 0,"kết thúc". 8},{"loại". "T_IDENTIFIER","bối cảnh". "giá trị bình thường". "fn","dòng". 1, "bắt đầu". 9,"kết thúc". 11},{"loại". "T_LPAREN","bối cảnh". "giá trị bình thường". "[","dòng". 1, "bắt đầu". 11,"kết thúc". 12},{"loại". "T_IDENTIFIER","bối cảnh". "giá trị bình thường". "x","dòng". 1, "bắt đầu". 12,"kết thúc". 13},{"loại". "T_RPAREN","bối cảnh". "giá trị bình thường". "]","dòng". 1, "bắt đầu". 13,"kết thúc". 14},{"loại". "T_LCURLY","ngữ cảnh". "giá trị bình thường". "{","dòng". 1, "bắt đầu". 15,"kết thúc". 16},{"loại". "T_IF","bối cảnh". "giá trị bình thường". "nếu","dòng". 2, "bắt đầu". 19,"kết thúc". 21},{"loại". "T_LPAREN","bối cảnh". "giá trị bình thường". "[","dòng". 2, "bắt đầu". 22,"kết thúc". 23},{"loại". "T_IDENTIFIER","bối cảnh". "giá trị bình thường". "x","dòng". 2, "bắt đầu". 23,"kết thúc". 24},{"loại". "T_STRICT_EQUAL","bối cảnh". "giá trị bình thường". "===","dòng". 2, "bắt đầu". 25,"kết thúc". 28},{"loại". "T_STRING","ngữ cảnh". "giá trị bình thường". "\"chuỗi\"","dòng". 2, "bắt đầu". 29,"kết thúc". 37},{"loại". "T_RPAREN","bối cảnh". "giá trị bình thường". "]","dòng". 2, "bắt đầu". 37,"kết thúc". 38},{"loại". "T_LCURLY","ngữ cảnh". "giá trị bình thường". "{","dòng". 2, "bắt đầu". 39,"kết thúc". 40},{"loại". "T_RETURN","bối cảnh". "giá trị bình thường". "dòng phản hồi". 2, "bắt đầu". 41,"kết thúc". 47},{"loại". "T_STRING","ngữ cảnh". "giá trị bình thường". "\"\"","dòng". 2, "bắt đầu". 48,"kết thúc". 50},{"loại". "T_SEMICOLON","bối cảnh". "giá trị bình thường". ";","dòng". 2, "bắt đầu". 50,"kết thúc". 51},{"loại". "T_RCURLY","ngữ cảnh". "giá trị bình thường". "}","dòng". 2, "bắt đầu". 52,"kết thúc". 53},{"loại". "T_ELSE","bối cảnh". "giá trị bình thường". "khác","dòng". 3, "bắt đầu". 56,"kết thúc". 60},{"loại". "T_IF","bối cảnh". "giá trị bình thường". "nếu","dòng". 3, "bắt đầu". 61,"kết thúc". 63},{"loại". "T_LPAREN","bối cảnh". "giá trị bình thường". "[","dòng". 3, "bắt đầu". 64,"kết thúc". 65},{"loại". "T_IDENTIFIER","bối cảnh". "giá trị bình thường". "x","dòng". 3, "bắt đầu". 65,"kết thúc". 66},{"loại". "T_STRICT_EQUAL","bối cảnh". "giá trị bình thường". "===","dòng". 3, "bắt đầu". 67,"kết thúc". 70},{"loại". "T_STRING","ngữ cảnh". "giá trị bình thường". "\"số\"","dòng". 3, "bắt đầu". 71,"kết thúc". 79},{"loại". "T_RPAREN","bối cảnh". "giá trị bình thường". "]","dòng". 3, "bắt đầu". 79,"kết thúc". 80},{"loại". "T_LCURLY","ngữ cảnh". "giá trị bình thường". "{","dòng". 3, "bắt đầu". 81,"kết thúc". 82},{"loại". "T_RETURN","bối cảnh". "giá trị bình thường". "dòng phản hồi". 3, "bắt đầu". 83,"kết thúc". 89},{"loại". "T_NUMBER","ngữ cảnh". "giá trị bình thường". "0","dòng". 3, "bắt đầu". 90,"kết thúc". 91},{"loại". "T_SEMICOLON","bối cảnh". "giá trị bình thường". ";","dòng". 3, "bắt đầu". 91,"kết thúc". 92},{"loại". "T_RCURLY","ngữ cảnh". "giá trị bình thường". "}","dòng". 3, "bắt đầu". 93,"kết thúc". 94},{"loại". "T_ELSE","bối cảnh". "giá trị bình thường". "khác","dòng". 4, "bắt đầu". 97,"kết thúc". 101},{"loại". "T_LCURLY","ngữ cảnh". "giá trị bình thường". "{","dòng". 4, "bắt đầu". 102,"kết thúc". 103},{"loại". "T_RETURN","bối cảnh". "giá trị bình thường". "dòng phản hồi". 4, "bắt đầu". 104,"kết thúc". 110},{"loại". "T_NULL","bối cảnh". "giá trị bình thường". "null","dòng". 4, "bắt đầu". 111,"kết thúc". 115},{"loại". "T_SEMICOLON","bối cảnh". "giá trị bình thường". ";","dòng". 4, "bắt đầu". 115,"kết thúc". 116},{"loại". "T_RCURLY","ngữ cảnh". "giá trị bình thường". "}","dòng". 4, "bắt đầu". 117,"kết thúc". 118},{"loại". "T_RCURLY","ngữ cảnh". "giá trị bình thường". "}","dòng". 5, "bắt đầu". 119,"kết thúc". 120}],"lỗi". []}
Flow âm thầm chấp nhận nó [và sử dụng
18 làm loại suy luận], nhưng không kiểm tra việc triển khai đối với chữ ký này. Điều này làm cho loại khai báo này trở thành một ứng cử viên phù hợp hơn cho các định nghĩa thư viện, trong đó việc triển khai bị bỏ qua
Giao điểm của các loại đối tượng
Khi bạn tạo giao điểm của các loại đối tượng, bạn hợp nhất tất cả các thuộc tính của chúng lại với nhau
Ví dụ: khi bạn tạo một giao điểm của hai đối tượng có các bộ thuộc tính khác nhau, nó sẽ tạo ra một đối tượng có tất cả các thuộc tính
1 2 3 4 5 6 7 8 9 10
// @flow
type A = { a: number };
type B = { b: boolean };
type C = { c: string };
function method[value: A & B & C] {
// ...
}
// $ExpectError
method[{ a: 1 }]; // Error!
// $ExpectError
method[{ a: 1, b: true }]; // Error!
method[{ a: 1, b: true, c: 'three' }]; // Works!
9{"giá trị". "// @flow\ntype One = { foo. số };\nloại Hai = { thanh. boolean };\and\n gõ Cả hai = Một và Hai;\n\ngiá trị var. Cả hai = {\n foo. 1,\n thanh. true\n};\n","mã thông báo". [{"loại". "Dòng","bối cảnh". "bình luận","giá trị". "// @flow","dòng". 1, "bắt đầu". 0,"kết thúc". 8},{"loại". "T_TYPE","ngữ cảnh". "giá trị bình thường". "loại","dòng". 2, "bắt đầu". 9,"kết thúc". 13},{"loại". "T_IDENTIFIER","bối cảnh". "loại","giá trị". "Một đường thẳng". 2, "bắt đầu". 14,"kết thúc". 17},{"loại". "T_ASSIGN","ngữ cảnh". "loại","giá trị". "=","dòng". 2, "bắt đầu". 18,"kết thúc". 19},{"loại". "T_LCURLY","ngữ cảnh". "loại","giá trị". "{","dòng". 2, "bắt đầu". 20,"kết thúc". 21},{"loại". "T_IDENTIFIER","bối cảnh". "giá trị bình thường". "foo","dòng". 2, "bắt đầu". 22,"kết thúc". 25},{"loại". "T_COLON","bối cảnh". "loại","giá trị". ". ","dòng". 2, "bắt đầu". 25,"kết thúc". 26},{"loại". "T_NUMBER_TYPE","ngữ cảnh". "loại","giá trị". "số","dòng". 2, "bắt đầu". 27,"kết thúc". 33},{"loại". "T_RCURLY","ngữ cảnh". "loại","giá trị". "}","dòng". 2, "bắt đầu". 34,"kết thúc". 35},{"loại". "T_SEMICOLON","bối cảnh". "giá trị bình thường". ";","dòng". 2, "bắt đầu". 35,"kết thúc". 36},{"loại". "T_TYPE","ngữ cảnh". "giá trị bình thường". "loại","dòng". 3, "bắt đầu". 37,"kết thúc". 41},{"loại". "T_IDENTIFIER","bối cảnh". "loại","giá trị". "Hai","dòng". 3, "bắt đầu". 42,"kết thúc". 45},{"loại". "T_ASSIGN","ngữ cảnh". "loại","giá trị". "=","dòng". 3, "bắt đầu". 46,"kết thúc". 47},{"loại". "T_LCURLY","ngữ cảnh". "loại","giá trị". "{","dòng". 3, "bắt đầu". 48,"kết thúc". 49},{"loại". "T_IDENTIFIER","bối cảnh". "giá trị bình thường". "thanh","dòng". 3, "bắt đầu". 50,"kết thúc". 53},{"loại". "T_COLON","bối cảnh". "loại","giá trị". ". ","dòng". 3, "bắt đầu". 53,"kết thúc". 54},{"loại". "T_BOOLEAN_TYPE","bối cảnh". "loại","giá trị". "boolean","dòng". 3, "bắt đầu". 55,"kết thúc". 62},{"loại". "T_RCURLY","ngữ cảnh". "loại","giá trị". "}","dòng". 3, "bắt đầu". 63,"kết thúc". 64},{"loại". "T_SEMICOLON","bối cảnh". "giá trị bình thường". ";","dòng". 3, "bắt đầu". 64,"kết thúc". 65},{"loại". "T_TYPE","ngữ cảnh". "giá trị bình thường". "loại","dòng". 5, "bắt đầu". 67,"kết thúc". 71},{"loại". "T_IDENTIFIER","bối cảnh". "loại","giá trị". "Cả hai","dòng". 5, "bắt đầu". 72,"kết thúc". 76},{"loại". "T_ASSIGN","ngữ cảnh". "loại","giá trị". "=","dòng". 5, "bắt đầu". 77,"kết thúc". 78},{"loại". "T_IDENTIFIER","bối cảnh". "loại","giá trị". "Một đường thẳng". 5, "bắt đầu". 79,"kết thúc". 82},{"loại". "T_BIT_AND","ngữ cảnh". "loại","giá trị". "&","dòng". 5, "bắt đầu". 83,"kết thúc". 84},{"loại". "T_IDENTIFIER","bối cảnh". "loại","giá trị". "Hai","dòng". 5, "bắt đầu". 85,"kết thúc". 88},{"loại". "T_SEMICOLON","bối cảnh". "giá trị bình thường". ";","dòng". 5, "bắt đầu". 88,"kết thúc". 89},{"loại". "T_VAR","ngữ cảnh". "giá trị bình thường". "var","dòng". 7, "bắt đầu". 91,"kết thúc". 94},{"loại". "T_IDENTIFIER","bối cảnh". "giá trị bình thường". "giá trị","dòng". 7, "bắt đầu". 95,"kết thúc". 100},{"loại". "T_COLON","bối cảnh". "loại","giá trị". ". ","dòng". 7, "bắt đầu". 100,"kết thúc". 101},{"loại". "T_IDENTIFIER","bối cảnh". "loại","giá trị". "Cả hai","dòng". 7, "bắt đầu". 102,"kết thúc". 106},{"loại". "T_ASSIGN","ngữ cảnh". "giá trị bình thường". "=","dòng". 7, "bắt đầu". 107,"kết thúc". 108},{"loại". "T_LCURLY","ngữ cảnh". "giá trị bình thường". "{","dòng". 7, "bắt đầu". 109,"kết thúc". 110},{"loại". "T_IDENTIFIER","bối cảnh". "giá trị bình thường". "foo","dòng". 8,"bắt đầu". 113,"kết thúc". 116},{"loại". "T_COLON","bối cảnh". "giá trị bình thường". ". ","dòng". 8,"bắt đầu". 116,"kết thúc". 117},{"loại". "T_NUMBER","ngữ cảnh". "giá trị bình thường". "1","dòng". 8,"bắt đầu". 118,"kết thúc". 119},{"loại". "T_COMMA","bối cảnh". "giá trị bình thường". ",","dòng". 8,"bắt đầu". 119,"kết thúc". 120},{"loại". "T_IDENTIFIER","bối cảnh". "giá trị bình thường". "thanh","dòng". 9,"bắt đầu". 123,"kết thúc". 126},{"loại". "T_COLON","bối cảnh". "giá trị bình thường". ". ","dòng". 9,"bắt đầu". 126,"kết thúc". 127},{"loại". "T_TRUE","bối cảnh". "giá trị bình thường". "true","dòng". 9,"bắt đầu". 128,"kết thúc". 132},{"loại". "T_RCURLY","ngữ cảnh". "giá trị bình thường". "}","dòng". 10,"bắt đầu". 133,"kết thúc". 134},{"loại". "T_SEMICOLON","bối cảnh". "giá trị bình thường". ";","dòng". 10,"bắt đầu". 134,"kết thúc". 135}],"lỗi". []}
Khi bạn có các thuộc tính trùng nhau do có cùng tên, Flow sẽ tuân theo cùng một chiến lược như với các hàm bị quá tải. nó sẽ trả về loại thuộc tính đầu tiên khớp với tên này
Ví dụ: nếu bạn hợp nhất hai đối tượng với một thuộc tính có tên là
Type1 & Type2 & ... & TypeN
4, đầu tiên là một loại số và thứ hai là một loại boolean, việc truy cập vào Type1 & Type2 & ... & TypeN
4 sẽ trả về Type1 & Type2 & ... & TypeN
610
11
{"giá trị". "loại Một = { prop. số };\ntype Two = { prop. boolean };\n\nkhai báo var both. Một & Hai;\n\nvar prop1. số = cả hai. chỗ dựa; . boolean = cả hai. chống đỡ; . số không tương thích với boolean\n","tokens". [{"loại". "T_TYPE","ngữ cảnh". "giá trị bình thường". "loại","dòng". 1, "bắt đầu". 0,"kết thúc". 4},{"loại". "T_IDENTIFIER","bối cảnh". "loại","giá trị". "Một đường thẳng". 1, "bắt đầu". 5, "kết thúc". 8},{"loại". "T_ASSIGN","ngữ cảnh". "loại","giá trị". "=","dòng". 1, "bắt đầu". 9,"kết thúc". 10},{"loại". "T_LCURLY","ngữ cảnh". "loại","giá trị". "{","dòng". 1, "bắt đầu". 11,"kết thúc". 12},{"loại". "T_IDENTIFIER","bối cảnh". "giá trị bình thường". "chống đỡ","dòng". 1, "bắt đầu". 13,"kết thúc". 17},{"loại". "T_COLON","bối cảnh". "loại","giá trị". ". ","dòng". 1, "bắt đầu". 17,"kết thúc". 18},{"loại". "T_NUMBER_TYPE","ngữ cảnh". "loại","giá trị". "số","dòng". 1, "bắt đầu". 19,"kết thúc". 25},{"loại". "T_RCURLY","ngữ cảnh". "loại","giá trị". "}","dòng". 1, "bắt đầu". 26,"kết thúc". 27},{"loại". "T_SEMICOLON","bối cảnh". "giá trị bình thường". ";","dòng". 1, "bắt đầu". 27,"kết thúc". 28},{"loại". "T_TYPE","ngữ cảnh". "giá trị bình thường". "loại","dòng". 2, "bắt đầu". 29,"kết thúc". 33},{"loại". "T_IDENTIFIER","bối cảnh". "loại","giá trị". "Hai","dòng". 2, "bắt đầu". 34,"kết thúc". 37},{"loại". "T_ASSIGN","ngữ cảnh". "loại","giá trị". "=","dòng". 2, "bắt đầu". 38,"kết thúc". 39},{"loại". "T_LCURLY","ngữ cảnh". "loại","giá trị". "{","dòng". 2, "bắt đầu". 40,"kết thúc". 41},{"loại". "T_IDENTIFIER","bối cảnh". "giá trị bình thường". "chống đỡ","dòng". 2, "bắt đầu". 42,"kết thúc". 46},{"loại". "T_COLON","bối cảnh". "loại","giá trị". ". ","dòng". 2, "bắt đầu". 46,"kết thúc". 47},{"loại". "T_BOOLEAN_TYPE","bối cảnh". "loại","giá trị". "boolean","dòng". 2, "bắt đầu". 48,"kết thúc". 55},{"loại". "T_RCURLY","ngữ cảnh". "loại","giá trị". "}","dòng". 2, "bắt đầu". 56,"kết thúc". 57},{"loại". "T_SEMICOLON","bối cảnh". "giá trị bình thường". ";","dòng". 2, "bắt đầu". 57,"kết thúc". 58},{"loại". "T_DECLARE","bối cảnh". "giá trị bình thường". "khai báo","dòng". 4, "bắt đầu". 60,"kết thúc". 67},{"loại". "T_VAR","ngữ cảnh". "giá trị bình thường". "var","dòng". 4, "bắt đầu". 68,"kết thúc". 71},{"loại". "T_IDENTIFIER","bối cảnh". "giá trị bình thường". "cả hai","dòng". 4, "bắt đầu". 72,"kết thúc". 76},{"loại". "T_COLON","bối cảnh". "loại","giá trị". ". ","dòng". 4, "bắt đầu". 76,"kết thúc". 77},{"loại". "T_IDENTIFIER","bối cảnh". "loại","giá trị". "Một đường thẳng". 4, "bắt đầu". 78,"kết thúc". 81},{"loại". "T_BIT_AND","ngữ cảnh". "loại","giá trị". "&","dòng". 4, "bắt đầu". 82,"kết thúc". 83},{"loại". "T_IDENTIFIER","bối cảnh". "loại","giá trị". "Hai","dòng". 4, "bắt đầu". 84,"kết thúc". 87},{"loại". "T_SEMICOLON","bối cảnh". "giá trị bình thường". ";","dòng". 4, "bắt đầu". 87,"kết thúc". 88},{"loại". "T_VAR","ngữ cảnh". "giá trị bình thường". "var","dòng". 6, "bắt đầu". 90,"kết thúc". 93},{"loại". "T_IDENTIFIER","bối cảnh". "giá trị bình thường". "prop1","dòng". 6, "bắt đầu". 94,"kết thúc". 99},{"loại". "T_COLON","bối cảnh". "loại","giá trị". ". ","dòng". 6, "bắt đầu". 99,"kết thúc". 100},{"loại". "T_NUMBER_TYPE","ngữ cảnh". "loại","giá trị". "số","dòng". 6, "bắt đầu". 101,"kết thúc". 107},{"loại". "T_ASSIGN","ngữ cảnh". "giá trị bình thường". "=","dòng". 6, "bắt đầu". 108,"kết thúc". 109},{"loại". "T_IDENTIFIER","bối cảnh". "giá trị bình thường". "cả hai","dòng". 6, "bắt đầu". 110,"kết thúc". 114},{"loại". "T_PERIOD","bối cảnh". "giá trị bình thường". ". ","dòng". 6, "bắt đầu". 114,"kết thúc". 115},{"loại". "T_IDENTIFIER","bối cảnh". "giá trị bình thường". "chống đỡ","dòng". 6, "bắt đầu". 115,"kết thúc". 119},{"loại". "T_SEMICOLON","bối cảnh". "giá trị bình thường". ";","dòng". 6, "bắt đầu". 119,"kết thúc". 120},{"loại". "Dòng","bối cảnh". "bình luận","giá trị". "// được","dòng". 6, "bắt đầu". 121,"kết thúc". 128},{"loại". "T_VAR","ngữ cảnh". "giá trị bình thường". "var","dòng". 7, "bắt đầu". 129,"kết thúc". 132},{"loại". "T_IDENTIFIER","bối cảnh". "giá trị bình thường". "prop2","dòng". 7, "bắt đầu". 133,"kết thúc". 138},{"loại". "T_COLON","bối cảnh". "loại","giá trị". ". ","dòng". 7, "bắt đầu". 138,"kết thúc". 139},{"loại". "T_BOOLEAN_TYPE","bối cảnh". "loại","giá trị". "boolean","dòng". 7, "bắt đầu". 140,"kết thúc". 147},{"loại". "T_ASSIGN","ngữ cảnh". "giá trị bình thường". "=","dòng". 7, "bắt đầu". 148,"kết thúc". 149},{"loại". "T_IDENTIFIER","bối cảnh". "giá trị bình thường". "cả hai","dòng". 7, "bắt đầu". 150,"kết thúc". 154},{"loại". "T_PERIOD","bối cảnh". "giá trị bình thường". ". ","dòng". 7, "bắt đầu". 154,"kết thúc". 155},{"loại". "T_IDENTIFIER","bối cảnh". "giá trị bình thường". "chống đỡ","dòng". 7, "bắt đầu". 155,"kết thúc". 159},{"loại". "T_SEMICOLON","bối cảnh". "giá trị bình thường". ";","dòng". 7, "bắt đầu". 159,"kết thúc". 160},{"loại". "Dòng","bối cảnh". "bình luận","giá trị". "// Lỗi. số không tương thích với boolean","dòng". 7, "bắt đầu". 161,"kết thúc". 206}],"lỗi". []}
Ghi chú. Khi nói đến các đối tượng, cách cụ thể theo thứ tự trong đó các loại giao lộ được triển khai trong Flow, thường có vẻ phản trực giác từ quan điểm lý thuyết tập hợp. Trong tập hợp, các toán hạng của giao có thể thay đổi thứ tự tùy ý [tính chất giao hoán]. Vì lý do này, cách tốt hơn là xác định loại hoạt động này trên các loại đối tượng bằng cách sử dụng toán tử trải rộng, e. g.
Type1 & Type2 & ... & TypeN
7, trong đó ngữ nghĩa đặt hàng được chỉ định tốt hơnCác loại giao lộ bất khả thi
Sử dụng các loại giao nhau, có thể tạo các loại không thể tạo trong thời gian chạy. Các loại giao lộ sẽ cho phép bạn kết hợp bất kỳ nhóm loại nào, ngay cả những loại xung đột với nhau
Ví dụ: bạn có thể tạo giao điểm của một số và một chuỗi
12____23
Không thể gọi `phương thức` với `3. 14` bị ràng buộc với `giá trị` vì số [1] không tương thích với chuỗi [2]. [cuộc gọi không tương thích] Không thể gọi `phương thức` với `'hi'` được liên kết với `giá trị` vì chuỗi [1] không tương thích với số [2]. [cuộc gọi không tương thích]
{"giá trị". "// @flow\n gõ NumberAndString = số và chuỗi;\in\phương thức hàm[giá trị. NumberAndString] {\n //. \n}\n\n// $ExpectError\nmethod[3. 14]; . \n// $ExpectError\nmethod['hi']; . \n","mã thông báo". [{"loại". "Dòng","bối cảnh". "bình luận","giá trị". "// @flow","dòng". 1, "bắt đầu". 0,"kết thúc". 8},{"loại". "T_TYPE","ngữ cảnh". "giá trị bình thường". "loại","dòng". 2, "bắt đầu". 9,"kết thúc". 13},{"loại". "T_IDENTIFIER","bối cảnh". "loại","giá trị". "NumberAndString","dòng". 2, "bắt đầu". 14,"kết thúc". 29},{"loại". "T_ASSIGN","ngữ cảnh". "loại","giá trị". "=","dòng". 2, "bắt đầu". 30,"kết thúc". 31},{"loại". "T_NUMBER_TYPE","ngữ cảnh". "loại","giá trị". "số","dòng". 2, "bắt đầu". 32,"kết thúc". 38},{"loại". "T_BIT_AND","ngữ cảnh". "loại","giá trị". "&","dòng". 2, "bắt đầu". 39,"kết thúc". 40},{"loại". "T_STRING_TYPE","ngữ cảnh". "loại","giá trị". "chuỗi","dòng". 2, "bắt đầu". 41,"kết thúc". 47},{"loại". "T_SEMICOLON","bối cảnh". "giá trị bình thường". ";","dòng". 2, "bắt đầu". 47,"kết thúc". 48},{"loại". "T_FUNCTION","bối cảnh". "giá trị bình thường". "chức năng","dòng". 4, "bắt đầu". 50,"kết thúc". 58},{"loại". "T_IDENTIFIER","bối cảnh". "giá trị bình thường". "phương pháp","dòng". 4, "bắt đầu". 59,"kết thúc". 65},{"loại". "T_LPAREN","bối cảnh". "giá trị bình thường". "[","dòng". 4, "bắt đầu". 65,"kết thúc". 66},{"loại". "T_IDENTIFIER","bối cảnh". "giá trị bình thường". "giá trị","dòng". 4, "bắt đầu". 66,"kết thúc". 71},{"loại". "T_COLON","bối cảnh". "loại","giá trị". ". ","dòng". 4, "bắt đầu". 71,"kết thúc". 72},{"loại". "T_IDENTIFIER","bối cảnh". "loại","giá trị". "NumberAndString","dòng". 4, "bắt đầu". 73,"kết thúc". 88},{"loại". "T_RPAREN","bối cảnh". "giá trị bình thường". "]","dòng". 4, "bắt đầu". 88,"kết thúc". 89},{"loại". "T_LCURLY","ngữ cảnh". "giá trị bình thường". "{","dòng". 4, "bắt đầu". 90,"kết thúc". 91},{"loại". "Dòng","bối cảnh". "bình luận","giá trị". "//. ","dòng". 5, "bắt đầu". 94,"kết thúc". 100},{"loại". "T_RCURLY","ngữ cảnh". "giá trị bình thường". "}","dòng". 6, "bắt đầu". 101,"kết thúc". 102},{"loại". "Dòng","bối cảnh". "bình luận","giá trị". "// $ExpectError","dòng". 8,"bắt đầu". 104,"kết thúc". 119},{"loại". "T_IDENTIFIER","bối cảnh". "giá trị bình thường". "phương pháp","dòng". 9,"bắt đầu". 120,"kết thúc". 126},{"loại". "T_LPAREN","bối cảnh". "giá trị bình thường". "[","dòng". 9,"bắt đầu". 126,"kết thúc". 127},{"loại". "T_NUMBER","ngữ cảnh". "giá trị bình thường". "3. 14","dòng". 9,"bắt đầu". 127,"kết thúc". 131},{"loại". "T_RPAREN","bối cảnh". "giá trị bình thường". "]","dòng". 9,"bắt đầu". 131,"kết thúc". 132},{"loại". "T_SEMICOLON","bối cảnh". "giá trị bình thường". ";","dòng". 9,"bắt đầu". 132,"kết thúc". 133},{"loại". "Dòng","bối cảnh". "bình luận","giá trị". "// Lỗi. ","dòng". 9,"bắt đầu". 134,"kết thúc". 143},{"loại". "Dòng","bối cảnh". "bình luận","giá trị". "// $ExpectError","dòng". 10,"bắt đầu". 144,"kết thúc". 159},{"loại". "T_IDENTIFIER","bối cảnh". "giá trị bình thường". "phương pháp","dòng". 11,"bắt đầu". 160,"kết thúc". 166},{"loại". "T_LPAREN","bối cảnh". "giá trị bình thường". "[","dòng". 11,"bắt đầu". 166,"kết thúc". 167},{"loại". "T_STRING","ngữ cảnh". "giá trị bình thường". "'xin chào'","dòng". 11,"bắt đầu". 167,"kết thúc". 171},{"loại". "T_RPAREN","bối cảnh". "giá trị bình thường". "]","dòng". 11,"bắt đầu". 171,"kết thúc". 172},{"loại". "T_SEMICOLON","bối cảnh". "giá trị bình thường". ";","dòng". 11,"bắt đầu". 172,"kết thúc". 173},{"loại". "Dòng","bối cảnh". "bình luận","giá trị". "// Lỗi. ","dòng". 11,"bắt đầu". 174,"kết thúc". 183}],"lỗi". [{"Tôi". "E1","tin nhắn". [{"Tôi". "E1M1","mô tả". "Không thể gọi `phương thức` với `3. 14` bị ràng buộc với `giá trị` vì số [1] không tương thích với chuỗi [2]. [cuộc gọi không tương thích]","bối cảnh". "phương pháp [3. 14]; . ","nguồn". "-","bắt đầu". {"dòng". 9,"cột". 8,"bù đắp". 127},"kết thúc". {"dòng". 9,"cột". 11,"bù đắp". 131}}],"hoạt động". null},{"id". "E2","tin nhắn". [{"Tôi". "E2M1","mô tả". "Không thể gọi `phương thức` với `'hi'` được liên kết với `giá trị` vì chuỗi [1] không tương thích với số [2]. [cuộc gọi không tương thích]","bối cảnh". "phương thức ['xin chào']; // Lỗi. ","nguồn". "-","bắt đầu". {"dòng". 11,"cột". 8,"bù đắp". 167},"kết thúc". {"dòng". 11,"cột". 11,"bù đắp". 171}}],"hoạt động". vô giá trị}]}
Nhưng bạn không thể tạo một giá trị vừa là số vừa là chuỗi, nhưng bạn có thể tạo kiểu cho nó. Không có cách sử dụng thực tế nào để tạo các loại như thế này, nhưng đó là tác dụng phụ của cách thức hoạt động của các loại giao nhau