Giao điểm chuỗi JavaScript

Đô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à

1
4

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

1
8 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

1
9 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ố

1
5 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

1
9 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

1
9 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

1
8 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
6

1
0
1
1

{"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ơn

Cá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

1
2____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

Làm cách nào để có giao điểm của hai tập hợp trong JavaScript?

Để có giao điểm của hai Tập hợp. .
Chuyển đổi Set đầu tiên thành một mảng
Sử dụng phương thức filter[] để lặp lại mảng
Sử dụng phương thức has[] để kiểm tra xem mỗi giá trị có được chứa trong Set thứ hai hay không
Chuyển đổi mảng trở lại Set

Có thể sử dụng forEach cho chuỗi JS không?

Không, không thể . forEach[] chuyển chỉ mục và mảng làm đối số thứ hai và thứ ba.

Làm cách nào để tìm giao điểm của một mảng trong JavaScript?

Tìm giao điểm của hai mảng trong JavaScript .
Sử dụng mảng. nguyên mẫu. .
Sử dụng Bộ. Một giải pháp khác là chuyển đổi mảng thành Bộ ES6 và gọi phương thức has[] của nó để kiểm tra các phần tử mảng khác. .
Sử dụng Thư viện Lodash/Gạch dưới. .
Sử dụng jQuery

Làm cách nào để có giao điểm của hai mảng đối tượng trong JavaScript?

Để lấy giao của hai mảng. Chuyển đổi các mảng thành các đối tượng Set để loại bỏ bất kỳ sự trùng lặp nào. Chuyển Set đầu tiên về mảng và gọi phương thức filter[] trên mảng đó. Trên mỗi lần lặp, hãy kiểm tra xem phần tử hiện tại có được chứa trong Tập hợp thứ hai không.

Chủ Đề