You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
在上面的示例中,我们使用 keyof 操作符获取了 Person 接口的属性名集合,并通过索引访问类型获取了 Person 接口中 name 属性的类型。
3. infer 关键字
infer 关键字用于在条件类型中推断类型,并将其赋值给一个类型变量。
typeReturnType<T>=Textends(...args: any[])=> infer R ? R : never;functionadd(a: number,b: number): number{returna+b;}typeAddReturnValue=ReturnType<typeofadd>;// 类型为 number
Partial<T> 是 TypeScript 中的一个内置泛型类型,它可以将给定类型 T 中的所有属性转换为可选属性。这对于创建部分完整的对象非常有用。
interfacePerson{name: string;age: number;}typePartialPerson=Partial<Person>;constpartialPerson: PartialPerson={name: 'John'};// age 属性是可选的
在上面的示例中,Partial<Person> 将 Person 接口中的所有属性变为可选属性,从而创建了一个部分完整的 PartialPerson 类型。
Required<T>
Required<T> 是 TypeScript 中的另一个内置泛型类型,它可以将给定类型 T 中的所有可选属性转换为必需属性。这对于确保对象的完整性非常有用。
interfacePerson{name?: string;age?: number;}typeRequiredPerson=Required<Person>;constrequiredPerson: RequiredPerson={name: 'John',age: 25};// name 和 age 属性是必需的
在上面的示例中,Required<Person> 将 Person 接口中的所有可选属性变为必需属性,从而创建了一个要求完整性的 RequiredPerson 类型。
Pick<T, K>
Pick<T, K> 是 TypeScript 中的另一个内置泛型函数,它可以从给定类型 T 中选择指定的属性 K 组成一个新的类型。
interfacePerson{name: string;age: number;address: string;}typeNameAndAge=Pick<Person,'name'|'age'>;constperson: NameAndAge={name:
'John',age: 25};// 只包含 name 和 age 属性
泛型和类型体操
泛型和类型体操(Type Gymnastics)是 TypeScript 中高级类型系统的重要组成部分。它们提供了强大的工具和技巧,用于处理复杂的类型操作和转换。
泛型(Generics)
1. 泛型函数
泛型函数允许我们在函数定义中使用类型参数,以便在函数调用时动态指定类型。例如:
在上面的示例中,
identity
函数使用类型参数T
,并返回与输入类型相同的值。通过显式传递泛型参数,我们可以确保在函数调用时指定了具体的类型。2. 泛型接口
泛型接口允许我们在接口定义中使用类型参数,以便在实现该接口时指定具体的类型。例如:
在上面的示例中,我们定义了一个泛型接口
Container
,它包含一个类型参数T
。通过指定Container<number>
,我们创建了一个具体的实现,其中的value
属性类型为number
。3. 泛型类
泛型类允许我们在类定义中使用类型参数,以便在创建类的实例时指定具体的类型。例如:
在上面的示例中,我们定义了一个泛型类
Stack
,它使用类型参数T
来表示堆栈中的元素类型。通过创建Stack<number>
的实例,我们限制了堆栈中的元素必须为number
类型。类型体操(Type Gymnastics)
1. 条件类型(Conditional Types)
条件类型允许我们根据输入类型的条件判断结果来选择不同的类型。条件类型的语法形式为:
其中,
T
是待检查的类型,U
是条件类型,X
是满足条件时返回的类型,Y
是不满足条件时返回的类型。下面是一个使用条件类型的示例:
在上面的示例中,我们定义了一个条件
类型
Check<T>
,它接受一个类型参数T
。如果T
是string
类型,那么Check<T>
的类型将是true
,否则为false
。2.
keyof
操作符和索引访问类型keyof
操作符用于获取类型的所有属性名,结合索引访问类型可以从一个类型中获取属性的具体类型。在上面的示例中,我们使用
keyof
操作符获取了Person
接口的属性名集合,并通过索引访问类型获取了Person
接口中name
属性的类型。3.
infer
关键字infer
关键字用于在条件类型中推断类型,并将其赋值给一个类型变量。在上面的示例中,
ReturnType
类型接受一个类型参数T
,并使用条件类型和infer
关键字推断函数类型的返回类型。通过调用ReturnType<typeof add>
,我们推断出add
函数的返回类型为number
。当涉及到泛型时,还有一些重要的概念和内置泛型函数可以深入分析。让我们继续探讨
extends
关键字、TS 官方内置的一些泛型函数以及它们的使用。extends
关键字和类型约束在泛型中,我们可以使用
extends
关键字来对泛型类型进行约束。这样可以确保传递给泛型的类型满足特定条件。在上面的示例中,
printProperty
函数接受一个泛型参数T
,该参数必须满足一个约束条件:具有name
属性,且name
的类型为string
。通过使用extends
关键字和类型约束,我们可以确保obj
参数具有所需的属性和类型,从而避免出现错误。泛型函数Util
TypeScript 提供了一些内置的泛型函数,这些函数被广泛用于处理各种类型操作。以下是一些常见的官方内置泛型函数:
Partial<T>
Partial<T>
是 TypeScript 中的一个内置泛型类型,它可以将给定类型T
中的所有属性转换为可选属性。这对于创建部分完整的对象非常有用。在上面的示例中,
Partial<Person>
将Person
接口中的所有属性变为可选属性,从而创建了一个部分完整的PartialPerson
类型。Required<T>
Required<T>
是 TypeScript 中的另一个内置泛型类型,它可以将给定类型T
中的所有可选属性转换为必需属性。这对于确保对象的完整性非常有用。在上面的示例中,
Required<Person>
将Person
接口中的所有可选属性变为必需属性,从而创建了一个要求完整性的RequiredPerson
类型。Pick<T, K>
Pick<T, K>
是 TypeScript 中的另一个内置泛型函数,它可以从给定类型T
中选择指定的属性K
组成一个新的类型。在上面的示例中,
Pick<Person, 'name' | 'age'>
从Person
接口中选择了'name'
和'age'
属性,创建了一个新的类型NameAndAge
。我们还可以结合泛型和内置泛型函数来实现更复杂的类型操作。以下是一个示例,展示了如何使用
Pick
和泛型来创建一个函数,该函数从给定对象中选择指定属性,并返回一个新的对象。在上面的示例中,
pickProperties
函数接受一个泛型参数T
和一个属性数组keys
。通过使用Pick<T, K>
,我们将从给定对象obj
中选择指定的属性keys
,并创建一个新的对象。这个例子结合了泛型、内置泛型函数
Pick
、keyof
操作符和extends
关键字,展示了如何在 TypeScript 中处理复杂的类型操作和转换。当涉及到官方内置的泛型函数时,还有一些重要的函数值得分析。让我们继续探讨一些常用的官方内置泛型函数以及它们的使用。
Exclude<T, U>
Exclude<T, U>
是 TypeScript 中的一个内置泛型函数,用于从类型T
中排除类型U
。它返回一个新类型,该新类型包含在T
中存在但不在U
中存在的成员类型。在上面的示例中,
Exclude<"a" | "b" | "c", "a" | "b">
排除了类型"a"
和"b"
,返回类型为"c"
。Omit<T, K>
Omit<T, K>
是 TypeScript 中的另一个内置泛型函数,它返回一个新类型,该新类型排除了类型T
中指定的属性K
。在上面的示例中,
Omit<Person, "address">
返回了一个新类型PersonWithoutAddress
,该类型排除了Person
接口中的address
属性。Readonly<T>
Readonly<T>
是 TypeScript 中的另一个内置泛型函数,它将类型T
中的所有属性转换为只读属性。在上面的示例中,
Readonly<Person>
将Person
接口中的所有属性变为只读属性,创建了一个新类型ReadonlyPerson
。总结
泛型和类型体操是 TypeScript 中强大的类型系统的关键组成部分。通过使用泛型,我们可以创建可重用、灵活和类型安全的代码。内置泛型函数提供了一些常用的类型转换工具,如
Partial
、Required
和Pick
,可以帮助我们更方便地处理类型操作。通过结合泛型、
extends
关键字、内置泛型函数和其他高级类型概念,我们能够在 TypeScript 中编写更复杂、类型安全的代码,并利用 TypeScript 的强大类型系统来提高代码的可读性、可维护性和可扩展性。The text was updated successfully, but these errors were encountered: