从0开始的 TypeScript之旅:infer、extends、keyof、typeof、in

作者:谁偷走了我的奶酪2024.01.18 10:52浏览量:7

简介:本文将介绍TypeScript中的infer、extends、keyof、typeof和in关键字的基本概念和用法,通过实际例子来解释这些概念如何应用于TypeScript编程中。

在TypeScript中,infer、extends、keyof、typeof和in关键字都为类型系统提供了强大的支持,使得开发者能够更准确地描述变量和对象的类型。这些关键字各有其独特的用途,让我们一一探究。
1. Infer
infer关键字在TypeScript中用于从函数参数中推断类型参数。这在泛型函数中特别有用,允许我们根据输入参数的类型来推断出类型参数。
例如,假设我们有一个函数,它接受一个对象数组并返回一个特定类型的对象数组。我们可以使用infer关键字从输入参数中推断出返回值的类型。

  1. function filterByType<T>(arr: object[], key: keyof any): Array<{ [P in keyof T]: T[P] }> {
  2. return arr.filter(obj => obj.hasOwnProperty(key)).map(obj => obj[key]);
  3. }

在这个例子中,我们使用infer关键字来推断返回值的类型,它是一个对象数组,每个对象都有一个特定的属性,该属性的类型是输入对象数组中对象的某个属性类型。
2. Extends
extends关键字在TypeScript中用于表示一个类型是另一个类型的子类型或超类型。这使得我们能够定义接口和类型的继承关系,从而实现代码的重用和更好的类型检查。
例如,我们可以定义一个接口Shape,然后定义一个类Circle继承自Shape接口。

  1. interface Shape {
  2. area(): number;
  3. }
  4. class Circle implements Shape {
  5. radius: number;
  6. constructor(radius: number) {
  7. this.radius = radius;
  8. }
  9. area(): number {
  10. return Math.PI * this.radius ** 2;
  11. }
  12. }

在这个例子中,Circle类使用implements关键字实现了Shape接口,并使用extends关键字继承了Shape接口的类型。这使得我们可以确保所有实现Shape接口的类都具有area()方法。
3. Keyof
keyof关键字在TypeScript中用于获取一个类型的所有键名的联合类型。这使得我们能够定义一个变量或参数,其类型是另一个对象的所有键名的集合。
例如,我们可以定义一个对象类型的键名的集合:

  1. const keys: keyof typeof person = ['name', 'age'];

在这个例子中,我们使用keyof关键字获取了person对象类型的所有键名,并将它们存储在变量keys中。这样,我们就可以使用这些键名来访问对象的属性。
4. Typeof
typeof关键字在TypeScript中用于获取一个类型的字符串字面量类型。这使得我们能够定义一个变量或参数,其类型是另一个对象的字符串表示形式。
例如,我们可以定义一个变量,其类型是字符串字面量类型:

  1. const type: typeof 'string' = 'hello';

在这个例子中,我们使用typeof关键字获取了字符串字面量类型的字符串表示形式,并将它存储在变量type中。这样,我们就可以使用这个变量来表示一个字符串类型的值。
5. In
最后,我们来谈谈in关键字。在TypeScript中,in用于判断一个值是否存在于一个对象的属性中。这在进行对象属性的遍历或查找时非常有用。同时,配合TypeScript的类型系统,我们还可以对属性的存在进行更精确的判断。例如:
typescript let obj = { foo: 1, bar: 2 }; if ('foo' in obj) { console.log(obj.foo); } 上述代码会输出1,因为’foo’这个属性存在于obj对象中。 另外,你还可以利用 TypeScript 的高级类型特性来对属性的存在进行更精确的判断: 例如: ```typescript type Keys = keyof { foo: number, bar: string }; function hasKey(obj: T, key: K): key in T { return key in obj as any; } let obj = { foo: 1, bar: ‘2’ }; console.log(hasKey(obj, ‘foo’)); // true console.log(hasKey(obj,