浅谈typescript中keyof与typeof操作符用法

当谈到TypeScript的类型系统时,我们经常听到keyof和typeof这两个操作符。这两个操作符的使用可以帮助我们更好地进行类型推断和类型检查。本文将详细讲解这两个操作符的用法以及它们在TypeScript中的常见应用。

keyof操作符

keyof操作符用于获取一个对象类型的所有键名,以联合类型的形式返回。它经常与泛型结合使用,可以在编译期进行类型检查。

interface Person {
  name: string;
  age: number;
  gender: 'male' | 'female';
}

type PersonKeys = keyof Person;
// 等价于 type PersonKeys = 'name' | 'age' | 'gender'

function getProperty<T, K extends keyof T>(obj: T, key: K) {
  return obj[key];
}

const person: Person = { name: '张三', age: 20, gender: 'male' };

getProperty(person, 'name'); // 返回 '张三'
getProperty(person, 'age'); // 返回 20
getProperty(person, 'gender'); // 返回 'male'
getProperty(person, 'email'); // 编译错误,因为 'email' 不是 Person 的键名

上述代码中,我们定义了一个Person类型的接口,获取了它的所有键名,并定义了一个通用的getProperty函数,该函数接受两个参数:obj和key,其中obj代表一个对象,key则代表obj的键名。在函数体中,我们通过键名来读取obj中对应的属性值,并返回该值。

需要注意的是,在定义函数getProperty时,我们使用了keyof操作符来约束泛型K的取值范围,这样可以确保我们传入的key参数一定是obj的键名之一。

在使用keyof时,我们还可以将它与typeof操作符结合使用。例如:

const person = { name: '张三', age: 20, gender: 'male' };

type PersonKeys = keyof typeof person;
// 等价于 type PersonKeys = 'name' | 'age' | 'gender'

上述代码中,我们定义了一个person对象,然后使用typeof操作符获取了它的类型,之后再使用keyof操作符获取了它的所有键名,最终得到了一个PersonKeys类型。需要注意的是,我们必须使用typeof操作符来获取一个对象的类型,否则keyof操作符将无法工作。

typeof操作符

typeof操作符用于获取一个值的类型,在TypeScript中,typeof返回的类型与JavaScript中的typeof返回的类型基本相同,但对于一些复杂类型,它们的表现可能会有所不同。

const person = { name: '张三', age: 20, gender: 'male' };

type PersonType = typeof person;
// 等价于 interface PersonType { name: string; age: number; gender: 'male' | 'female' }

上述代码中,我们定义了一个person对象,然后使用typeof操作符获取了它的类型,并将其赋值给变量PersonType。我们可以看到,PersonType的类型与person对象的类型相同,它们都包含了name、age和gender三个属性。

需要注意的是,typeof操作符并不能获取一个接口的类型定义,例如:

interface Person {
  name: string;
  age: number;
  gender: 'male' | 'female';
}

type PersonType = typeof Person; // 编译错误,因为typeof操作符不能获取接口的类型定义

在大多数情况下,我们使用typeof操作符来获取变量的类型。但有时,我们希望获取一个类的实例类型,这时我们可以使用instanceof操作符。例如:

class Person {
  name: string;
  age: number;
  gender: 'male' | 'female';

  constructor(name: string, age: number, gender: 'male' | 'female') {
    this.name = name;
    this.age = age;
    this.gender = gender;
  }
}

const person = new Person('张三', 20, 'male');

type PersonType = typeof person; // 编译错误,因为typeof操作符不能获取类的实例类型

if (person instanceof Person) {
  type PersonType = typeof person;
  // 等价于 interface PersonType { name: string; age: number; gender: 'male' | 'female' }
}

在上述代码中,我们定义了一个Person类,并创建了一个person实例。由于typeof操作符不能获取类的实例类型,我们用instanceof操作符来判断person是否为Person类的实例,并在if语句中定义了一个PersonType类型来表示person的类型。需要注意的是,在使用instanceof操作符时,我们必须将类型定义放在if语句中,否则编译器将无法进行类型检查。

综上所述,keyof和typeof操作符是TypeScript中两个重要的类型操作符,它们的使用可以帮助我们更好地进行类型推断和类型检查。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:浅谈typescript中keyof与typeof操作符用法 - Python技术站

(0)
上一篇 2023年6月10日
下一篇 2023年6月10日

相关文章

  • 分享JavaScript监听全部Ajax请求事件的方法

    下面就是关于“分享JavaScript监听全部Ajax请求事件的方法”的完整攻略。 标题 分享JavaScript监听全部Ajax请求事件的方法 正文 在前端开发中,JavaScript监听Ajax请求事件是非常重要的一个功能,常常需要根据请求事件做一些处理,比如显示Loading、禁用表单等等。以下是一种比较简单的方法,既可以使用原生的JavaScript…

    JavaScript 2023年6月11日
    00
  • asp.net微信开发(用户分组管理)

    ASP.NET微信开发(用户分组管理)攻略 简介 微信用户分组管理是微信公众平台提供的一项服务,可以对公众号的用户进行分类管理,更方便地进行用户管理和消息推送。在ASP.NET微信开发中,我们可以通过接口调用实现微信用户分组管理。 步骤 获取access_token 在操作微信用户分组之前,需要先获取access_token。access_token是调用微…

    JavaScript 2023年6月10日
    00
  • 基于JavaScript实现淘宝商品广告效果

    让我来详细讲解一下”基于JavaScript实现淘宝商品广告效果”的完整攻略。 1. 简介 该攻略介绍了如何使用JavaScript实现淘宝商品广告效果,这种效果通常使用在商品推广页和商城首页等页面进行商品推广。在本攻略中,我们将使用一些JavaScript技术,例如jQuery库和CSS3动画技术,来实现淘宝商品广告效果。 2. 步骤 以下是实现淘宝商品广…

    JavaScript 2023年6月11日
    00
  • 你有必要知道的10个JavaScript难点

    你有必要知道的10个JavaScript难点 1. 变量提升 JavaScript 中的变量提升是指 JS 引擎将变量声明提升到作用域的顶部,即在变量声明之前就能访问该变量。变量提升会造成变量值的不确定性,应该格外注意。 例如: x = 5; console.log(x); var x; 这个例子中,虽然变量 x 的值在声明之前被赋值为 5,但是在变量声明之…

    JavaScript 2023年5月18日
    00
  • 原生js实现简单轮播图效果

    下面我来详细讲解如何用原生JS实现简单轮播图效果。 步骤1:HTML结构 我们首先需要在HTML文件中创建轮播图的骨架,通常可以使用<ul>标签和若干个<li>标签来实现。例如: <div id="slider"> <ul> <li><img src="slide…

    JavaScript 2023年6月11日
    00
  • 纯JS实现的读取excel文件内容功能示例【支持所有浏览器】

    下面是详细讲解“纯JS实现的读取excel文件内容功能示例【支持所有浏览器】”的完整攻略。 1. 准备工作 在使用JS读取excel文件之前,需要先引入一些第三方库,下面是这些库的名称和链接: SheetJS – 一个纯JS实现的excel文件读写库,支持xlsx、csv、ods等多种格式。 FileSaver.js – 一个提供了文件保存功能的JS库,用于…

    JavaScript 2023年5月27日
    00
  • JavaScript中arguments的使用方法详解

    JavaScript中arguments的使用方法详解 在JavaScript中,我们可以使用arguments来获取函数调用时传入的所有参数。本文将对arguments的使用方法进行详细讲解,并且给出两个示例说明。 1. 获取传入的所有参数 我们可以使用arguments获取函数调用时传入的所有参数。arguments是一个类数组对象,可以通过argume…

    JavaScript 2023年5月27日
    00
  • Array数组对象中的forEach、map、filter及reduce详析

    Array数组对象中的forEach、map、filter及reduce详析 对于开发者而言,Array是非常常用的数据类型之一。在Array中,有四个方法:forEach、map、filter及reduce。下面我们将逐一深入剖析它们的用法及使用场景。 forEach forEach方法的作用是:用于遍历数组中的每一个元素,并对其进行操作。语法如下: ar…

    JavaScript 2023年6月10日
    00
合作推广
合作推广
分享本页
返回顶部