浅谈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日

相关文章

  • jQuery.validate.js表单验证插件的使用代码详解

    那我就来详细讲解一下“jQuery.validate.js表单验证插件的使用代码详解”的攻略吧。 什么是jQuery.validate.js表单验证插件? jQuery.validate.js是一个jQuery的表单验证插件,它可以方便地实现表单输入内容的合法性检测和提示。 如何引入jQuery.validate.js? 在使用jQuery.validate…

    JavaScript 2023年6月10日
    00
  • JS实现的自动打字效果示例

    接下来我将为你讲解“JS实现的自动打字效果示例”的完整攻略。 这是一个比较常见的网页效果,可以使用 JavaScript 来实现。整个过程大体可分为以下几个步骤: 步骤一:准备 HTML 结构 首先,你需要准备一个包含文字内容的 HTML 元素,例如: <div id="text"> <p>这是一段文本内容,我们将…

    JavaScript 2023年5月28日
    00
  • JavaScript实现打砖块游戏

    JavaScript实现打砖块游戏攻略 简介 打砖块游戏是一款非常经典的小游戏,它的核心玩法是玩家要逐一击碎各种形状的砖块,来获得游戏分数。在该游戏中,玩家需要使用挡板控制小球反弹,击打并攻破砖块,从而通过每一关的挑战,最终完成游戏。 下面,我们将介绍如何使用JavaScript来实现打砖块游戏。 HTML和CSS搭建基础页面 在实现打砖块游戏之前,我们首先…

    JavaScript 2023年6月11日
    00
  • flash调用js中的方法,让js传递变量给flash的办法及思路

    实现Flash调用JS方法并接收JS传递的变量有以下两种常见做法: 一、使用 ExternalInterface 作为一个Flash插件的开发者,可以使用 ExternalInterface 达到让 Flash 调用 JavaScript,让 JavaScript 调用 Flash 之间互相交互的目的。 以下是一个示例说明: Flash定义和带入数据 Fla…

    JavaScript 2023年6月11日
    00
  • js表格排序实例分析(支持int,float,date,string四种数据类型)

    以下是“js表格排序实例分析”的完整攻略: 简介 在网页开发中,表格是非常常见的元素,而在这些表格中为了用户的方便,我们可能需要给表格加上排序功能。这篇文章将介绍如何使用JS实现一个表格排序的功能。针对表格中不同的数据类型(int,float,date和string),我们将分别实现排序功能。 准备工作 在实现排序功能之前,我们需要做一些准备工作。 添加表格…

    JavaScript 2023年6月10日
    00
  • 你不知道的5个JavaScript中JSON的秘密功能分享

    你不知道的5个JavaScript中JSON的秘密功能分享 1. JSON 对象的 stringify() 方法 定义 我们知道,JavaScript 中的 JSON 对象有一个 stringify() 方法,它的作用是将一个 JavaScript 对象转换成对应的 JSON 字符串。 用法 const obj = { name: ‘Lucas’, age:…

    JavaScript 2023年6月10日
    00
  • 利用js编写网页进度条效果

    编写网页进度条效果通常需要用到JavaScript语言。下面是利用JS编写网页进度条效果的几个步骤: 1. 创建进度条的HTML布局 首先,你需要确定进度条的位置和尺寸,并在HTML中创建一个<div>元素作为进度条容器,在这个容器内放置一个表示进度的<div>子元素。 示例1:简单的进度条布局 <div class=&quot…

    JavaScript 2023年6月11日
    00
  • Javascript之面向对象–方法

    下面是Javascript面向对象方法的完整攻略。 什么是面向对象 在开始讲解面向对象方法之前,需要先了解什么是面向对象。面向对象编程(Object Oriented Programming,OOP)是一种软件开发的方法和思想,它以对象为基础,通过封装、继承、多态等特性实现代码的灵活复用、维护和拓展。在Javascript中,我们可以通过构造函数和原型链来实…

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