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

如用户在输出中看到的,对象的属性都相同,显示了真实值。

更新于:2022年12月19日

1000+ 浏览量

启动你的职业生涯

完成课程获得认证

开始学习
广告