TypeScript中的交集类型是什么?
在本教程中,我们将学习TypeScript中的交集类型。
借助TypeScript,我们可以混合各种类型以产生更全面和有效的用例。通过了解其背后的设计理念,您可以学习如何在TypeScript中更有效地构建联合类型和交集类型。
在TypeScript中,一个称为“交集类型”的概念有效地使我们能够组合不同的类型。
我们可以使用交集类型组合不同的类型定义并利用现有的类型定义。尽管TypeScript中的交集类型和联合类型相似,但它们的使用方式却大相径庭。组合不同类型为一体的类型称为交集类型。这使您可以组合多种类型以产生具有所有必需属性的单个类型。此类型的对象将包含每个提供的类型中的成员。交集类型使用“&”运算符创建。
避免让“交集”一词误导您,将数学集合与逻辑混淆。当两种类型在TypeScript中相交时,交集类型将继承两种相交类型的特性。在组合具有不同类型的同名属性的类型时,请务必小心。
语法
我们可以编写以下语法在TypeScript中使用交集类型。
type variable_3 = variable_1 & variable_2; let var: variable_3; // All of the attributes from variable_1 and variable_2 apply to the variable 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);
输出
以上代码将产生以下输出:
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接口相交,并将其存储到intersected types中。之后,从创建的交集类型的对象中检索值。最后,我们使用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
如用户在输出中看到的,对象的属性都相同,显示了真实值。