TypeScript 中的交叉类型是什么?
在本教程中,我们将学习 TypeScript 中的交叉类型是什么。
借助 TypeScript,我们可以混合使用各种类型,从而生成更全面、更高效的用例。您可以通过了解它们背后的设计理念,学习如何在 TypeScript 中更有效地构建联合类型和交叉类型。
在 TypeScript 中,"交叉类型"的概念使我们能够有效地组合不同的类型。
我们可以通过使用交叉类型来组合不同的类型定义并利用现有的类型定义。虽然 TypeScript 中的交叉类型和联合类型相似,但它们的使用方式却大相径庭。将不同类型的类型组合成一种类型称为交叉类型。这使您可以组合多种类型以生成具有所有必要属性的单一类型。每种类型的成员都将存在于此类型的对象中。交集类型使用"&"运算符创建。
避免"交集"一词误导您,将数学集合与逻辑混淆。当 TypeScript 中的两个类型相交时,交集类型将继承两个相交类型的特性。组合与不同种类共享属性名称的类型时请务必谨慎。
语法
我们可以编写以下语法在 TypeScript 中使用交集类型。
type Variable_3 = Variable_1 & Variable_2; let var: Variable_3; // Variable_1 和 Variable_2 的所有属性都应用于变量 var。
如上语法所示,这里我们将两个变量(即 Variable_1 和 Variable_2)相交,并将值存储在 Variable_3 中。之后,variable_3 的属性存储在 var 中。
示例
如以下示例所示,我们创建了两个名为"Book"和"Author"的接口。在 Book 接口中,我们创建了两个字段,分别为数字类型的"book_id"和字符串类型的"book_name"。在 Author 接口中,我们也创建了两个字段,分别为数字类型的"author_id"和字符串类型的"author_name"。接下来,我们将 Book 接口和 Author 接口进行交叉,并将其存储到 intersected_types 中。最后,从创建的交叉类型的对象中检索值。
interface Book {
book_id: number
book_name: string
}
interface Author {
author_id: number
author_name: string
}
type intersected_type = Book & Author
let intersected_type_object1: intersected_type = {
book_id: 101,
book_name: 'Typescript is Awesome',
author_id: 202,
author_name: 'Tutorialspoint!',
}
console.log('Book Id: ' + intersected_type_object1.book_id)
console.log('Book name: ' + intersected_type_object1.book_name)
console.log('Author Id: ' + intersected_type_object1.author_id)
console.log('Author name: ' + intersected_type_object1.author_name)
编译后,它将生成以下 JavaScript 代码 -
var intersected_type_object1 = {
book_id: 101,
book_name: 'Typescript is Awesome',
author_id: 202,
author_name: 'Tutorialspoint!'
};
console.log('Book Id: ' + intersected_type_object1.book_id);
console.log('Book name: ' + intersected_type_object1.book_name);
console.log('Author Id: ' + intersected_type_object1.author_id);
console.log('Author name: ' + intersected_type_object1.author_name);
输出
上述代码将产生以下输出 &minuns;
Book Id: 101 Book name: Typescript is Awesome Author Id: 202 Author name: Tutorialspoint!
正如用户在输出中看到的,两个不同接口的所有值都被组合并显示出来。
交集类型包括结合律和交换律
交换律表示方程的因式可以自由排列,而不会改变方程的结果。
交换律:(A & B) = (B & A)
结合律断言,在运算过程中改变整数的分组方式不会影响方程的解。
结合律:(A & B) & C = A & (B & C)
当我们交叉两种或多种类型时,它们的顺序并不重要。'typeof' 运算符用于验证相交对象的属性是否相同,无论项如何相交或以何种顺序相交。
示例
正如我们如下例所示,我们创建了三个接口,分别为"Student"、"Class"和"Subject"。在Student实例中,我们创建了两个字段,分别为"student_id"(数字类型)和"sudent_name"(字符串类型)。在"Class"实例中,我们还创建了两个字段,分别为"class_id"(数字类型)和"class_name"(字符串类型)。在"Subject"实例中,我们也创建了两个字段,分别为"subject_id"(数字类型)和"subject_name"(字符串类型)。
接下来,我们使用关联属性将Book、Author和Subject接口相交,并将其存储到相交类型中。之后,从创建的相交类型的对象中检索值。最后,我们使用typeof运算符检查对象并登录到控制台。
interface Student {
student_id: number
student_name: string
}
interface Class {
class_id: number
class_name: string
}
interface Subject {
subject_id: number
subject_name: string
}
type intersected_type_1 = (Student & Class) & Subject
type intersected_type_2 = Student & (Class & Subject)
let intersected_type_object1: intersected_type_1 = {
student_id: 101,
student_name: 'Typescript',
class_id: 10,
}
let intersected_type_object2: intersected_type_2 = {
student_id: 102,
student_name: 'Typescript2',
class_id: 11,
}
console.log(typeof intersected_type_object1 === typeof intersected_type_object2)
编译后,它将生成以下 JavaScript 代码 -
var intersected_type_object1 = {
student_id: 101,
student_name: 'Typescript',
class_id: 10
};
var intersected_type_object2 = {
student_id: 102,
student_name: 'Typescript2',
class_id: 11
};
console.log(typeof intersected_type_object1 === typeof intersected_type_object2);
输出
上述代码将产生以下输出 -
true
正如用户在输出中看到的,两个对象的属性是相同的,显示的是真实值。

