Kiểu Giao nhau của TypeScript giống như hợp nhất? Nhưng nếu là kiểu nguyên thủy thì thực sự là giao nhau
Tôi gặp khó khăn trong việc hiểu tại sao trong TypeScript, phép giao & lại giống như "kết hợp":
type CEO = {
name: string,
boardToReportTo: string
};
type Employee = {
name: string,
manager: string
};
type Both = CEO & Employee;
Vì vậy bây giờ, Both có thể có các thuộc tính của name, boardToReportTo và manager. Nó giống như một sự "hợp nhất", không phải giao nhau, mà giao nhau chỉ là name. (Và sự "hợp nhất" này giống như một "liên hiệp")
Tuy nhiên, nếu nó còn nguyên thủy:
type Foo = string & number;
Bây giờ nó không còn "gộp" nữa như trên. Bây giờ nó thực sự là giao nhau, có nghĩa là nó là never, hoặc bottom, hoặc empty.
Vì vậy tôi không hiểu lắm, thực sự là 'hợp nhất' hay 'giao nhau', vì dường như đôi khi là cái này, đôi khi là cái kia.
Câu trả lời #1
Tất cả điều này đều xuất phát từ logic tập hợp mà bạn có thể đã học trong toán ở trường.
Chúng ta có một tập hợp các phần tử A và một tập hợp các phần tử B. Giao của các tập hợp A & B là tập hợp các phần tử mà cả hai đều thuộc về A và B.
Nếu chúng ta có tập hợp các loại trái cây (táo, cam, việt quất, v.v.) và một tập hợp các thứ có màu vàng (biển báo nhường đường, xe tải rác, mặt trời, v.v.) và chúng ta lấy giao của hai tập hợp đó, chúng ta sẽ được các loại trái cây màu vàng (ví dụ: chuối).
Cùng một logic áp dụng cho Typescript.
Nếu chúng ta có một chữ A:
type A = {
a: string
}
và một B
type B = {
b: number
}
thì giao của A & B sẽ là những thứ vừa là A vừa là B:
const x: A & B = {
a: 'hi', // makes it structurally an A
b: 5, // makes it structurally a B
};
bởi vì nó khớp với sơ đồ cho A, và nó khớp với sơ đồ của B. Nhưng khi chúng ta áp dụng cùng một logic đó cho các nguyên thủy, rõ ràng là tập hợp những thứ mà ví dụ vừa là số vừa là chuỗi là tập rỗng. Không có giá trị nào đồng thời vừa là số vừa là chuỗi, nên chúng ta gọi kiểu đó là never.
const foo: string & number = ?; // nothing satisfies this type
Vậy nên thực ra không có sự khác biệt thực sự giữa cách nó xử lý các kiểu nguyên thủy và các kiểu đối tượng, logic cơ bản là giống nhau cho cả hai. Các kiểu đối tượng thực ra không hẳn là 'hợp nhất', mặc dù tôi chắc chắn có thể hiểu được cách diễn đạt đó có ý nghĩa và bạn đã lấy nó từ đâu.
Sân chơi
Câu trả lời #2
Giao nhau của các kiểu không nguyên thủy không thể chỉ gọi là hợp nhất. Nó vừa hợp nhất vừa giao nhau cùng một lúc.
- Các trường bị thiếu trong một trong các đối tượng được hợp nhất trong kiểu kết quả.
type Param1 = {
a: string;
};
type Param2 = {
b: number;
};
// {
// a: string;
// b: number;
// }
type Result = Param1 & Param2;
- Các trường tồn tại trong cả hai đối tượng được giao nhau:
type Param1 = {
a: string;
};
type Param2 = {
a: number;
};
// never
type Result = (Param1 & Param2)['a'];
