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

yizhihongxing

当谈到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 self对象使用详解

    JavaScript Self对象使用详解 什么是Self对象? Self对象指的是JavaScript中的this关键字,它代表当前对象。可以在对象的方法中使用this关键字来引用当前对象,或者用在一个方法中引用其他方法。 如何使用Self对象? 在对象方法中使用Self对象 在JavaScript的对象方法中使用this关键字可以引用到当前的对象。如下例…

    JavaScript 2023年5月27日
    00
  • javascript history对象(历史记录)使用方法(实现浏览器前进后退)

    JavaScript中的history对象提供了访问浏览器历史记录的方法,可以使用history对象来实现在浏览器中前进后退的功能。本文将详细介绍如何使用JavaScript history对象实现浏览器前进后退功能。 1. history对象概述 history对象是JavaScript中的一个内置对象,它代表着用户访问过的浏览器窗口中的历史记录。当浏览器…

    JavaScript 2023年6月11日
    00
  • 详细分析单线程JS执行问题

    好的。首先,我们来了解一下单线程JS执行问题。 JavaScript是一种单线程的语言,只能在一个主线程上执行。这意味着,JavaScript代码只能以串行的方式执行,也就是说,只能一个函数一个函数依次执行,不会出现多个函数同时运行的情况。 这样做有什么好处呢?一方面,可以避免多个线程之间的竞争和同步问题;另一方面,可以使代码的执行顺序更加明确和可控。 但同…

    JavaScript 2023年5月28日
    00
  • Javascript闭包与函数柯里化浅析

    JavaScript 闭包与函数柯里化是 JavaScript 中非常重要且常见的概念,对于想要成为一名 JavaScript 开发工程师来说是必不可少的。下面将分别详细讲解闭包和函数柯里化的概念和原理,并提供两个示例来说明它们的用法和效果。 JavaScript 闭包 闭包是通过函数访问其被定义时的词法作用域(决定变量作用域的范围)的能力。简单来说,闭包就…

    JavaScript 2023年6月10日
    00
  • js友好的时间返回函数

    下面我将详细讲解如何编写一个JS友好的时间返回函数: 什么是JS友好的时间返回函数? JS友好的时间返回函数是指能够将时间戳或者日期字符串转换为易于阅读的人类可读格式的JavaScript函数。比如将日期字符串”2019-08-01T12:00:00.000Z”转换为”2019年8月1日12点”这样的格式。 编写JS友好的时间返回函数 从时间戳转换为人类可读…

    JavaScript 2023年5月27日
    00
  • Javascript & DHTML DOM基础和基本API第5/5页

    《Javascript & DHTML DOM基础和基本API》是一本介绍JavaScript和DHTML的书籍,其中包含了JavaScript和DHTML DOM的基础和API,本攻略将对第5/5页进行详细解读。 1. 什么是DOM? DOM(Document Object Model)是HTML和XML文档的编程接口,它将整个页面抽象成一个树状结…

    JavaScript 2023年6月10日
    00
  • Python/JS实现常见加密算法的示例代码

    以下是Python/JS实现常见加密算法的示例代码的完整攻略: 了解常见加密算法: 在实现常见加密算法之前,我们需要了解常用的加密算法。常见的加密算法包括对称加密算法和非对称加密算法。对称加密算法指加密和解密使用相同的密钥,包括AES、DES等;非对称加密算法指加密和解密使用不同的密钥,包括RSA、DSA等。 实现Python/JS示例代码: 2.1 使用P…

    JavaScript 2023年5月19日
    00
  • JavaScript代码模拟鼠标自动点击事件示例

    针对“JavaScript代码模拟鼠标自动点击事件”这个话题,我会给出详细的攻略,包含以下内容: 点击事件基础知识介绍 JavaScript 模拟鼠标自动点击事件的方式 示例说明 1.点击事件基础知识介绍 在 web 开发中,点击事件是比较常见的交互行为,可以使用鼠标或者触摸屏等设备进行触发。在页面中,我们可以通过注册点击事件监听器来实现对点击事件的响应处理…

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