返回顶部
首页 > 资讯 > 精选 >typescript中keyof与typeof操作符怎么使用
  • 816
分享到

typescript中keyof与typeof操作符怎么使用

2023-07-02 12:07:59 816人浏览 八月长安
摘要

这篇文章主要介绍“typescript中keyof与typeof操作符怎么使用”,在日常操作中,相信很多人在typescript中keyof与typeof操作符怎么使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家

这篇文章主要介绍“typescript中keyof与typeof操作符怎么使用”,在日常操作中,相信很多人在typescript中keyof与typeof操作符怎么使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”typescript中keyof与typeof操作符怎么使用”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

一、keyof 简介

TypeScript 允许我们遍历某种类型的属性,并通过 keyof 操作符提取其属性的名称。keyof 操作符是在 TypeScript 2.1 版本引入的,该操作符可以用于获取某种类型的所有键,其返回类型是联合类型。
下面我们来看个例子:

interface Person {  name: string;  age: number;  location: string;}type K1 = keyof Person; // "name" | "age" | "location"type K2 = keyof Person[];  // number | "length" | "push" | "concat" | ...type K3 = keyof { [x: string]: Person };  // string | number

除了接口外,keyof 也可以用于操作类,比如:

class Person {  name: string = "Semlinker";}let sname: keyof Person;sname = "name";

若把 sname = “name” 改为 sname = “age” 的话,TypeScript 编译器会提示以下错误信息:

Type '"age"' is not assignable to type '"name"'.

keyof 操作符除了支持接口和类之外,它也支持基本数据类型:

let K1: keyof boolean; // let K1: "valueOf"
let K2: keyof number; // let K2: "toString" | "toFixed" | "toExponential" | ...
let K3: keyof symbol; // let K1: "valueOf"

此外 keyof 也称为输入索引类型查询,与之相对应的是索引访问类型,也称为查找类型。在语法上,它们看起来像属性或元素访问,但最终会被转换为类型:

type P1 = Person["name"];  // stringtype P2 = Person["name" | "age"];  // string | numbertype P3 = string["charAt"];  // (pos: number) => stringtype P4 = string[]["push"];  // (...items: string[]) => numbertype P5 = string[][0];  // string

二、keyof 的作用

javascript 是一种高度动态的语言。有时在静态类型系统中捕获某些操作的语义可能会很棘手。以一个简单的prop 函数为例:

function prop(obj, key) {  return obj[key];}

该函数接收 obj 和 key 两个参数,并返回对应属性的值。对象上的不同属性,可以具有完全不同的类型,我们甚至不知道 obj 对象长什么样。

那么在 TypeScript 中如何定义上面的 prop 函数呢?我们来尝试一下:

function prop(obj: object, key: string) {  return obj[key];}

在上面代码中,为了避免调用 prop 函数时传入错误的参数类型,我们为 obj 和 key 参数设置了类型,分别为 {} 和 string 类型。然而,事情并没有那么简单。针对上述的代码,TypeScript 编译器会输出以下错误信息:

Element implicitly has an 'any' type because expression of type 'string' can't be used to index type '{}'

元素隐式地拥有 any 类型,因为 string 类型不能被用于索引 {} 类型。要解决这个问题,你可以使用以下非常暴力的方案:

function prop(obj: object, key: string) {  return (obj as any)[key];}

很明显该方案并不是一个好的方案,我们来回顾一下 prop 函数的作用,该函数用于获取某个对象中指定属性的属性值。因此我们期望用户输入的属性是对象上已存在的属性,那么如何限制属性名的范围呢?这时我们可以利用本文的主角 keyof 操作符:

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

在以上代码中,我们使用了 TypeScript 的泛型和泛型约束。首先定义了 T 类型并使用 extends 关键字约束该类型必须是 object 类型的子类型,然后使用 keyof 操作符获取 T 类型的所有键,其返回类型是联合类型,最后利用 extends 关键字约束 K 类型必须为 keyof T 联合类型的子类型。 是骡子是马拉出来遛遛就知道了,我们来实际测试一下:

type Todo = {  id: number;  text: string;  done: boolean;}const todo: Todo = {  id: 1,  text: "Learn TypeScript keyof",  done: false}function prop<T extends object, K extends keyof T>(obj: T, key: K) {  return obj[key];}const id = prop(todo, "id"); // const id: numberconst text = prop(todo, "text"); // const text: strinGConst done = prop(todo, "done"); // const done: boolean

很明显使用泛型,重新定义后的 prop<T extends object, K extends keyof T>(obj: T, key: K) 函数,已经可以正确地推导出指定键对应的类型。那么当访问 todo 对象上不存在的属性时,会出现什么情况?比如:

const date = prop(todo, "date");

对于上述代码,TypeScript 编译器会提示以下错误:

Argument of type '"date"' is not assignable to parameter of type '"id" | "text" | "done"'.

这就阻止我们尝试读取不存在的属性。

三、keyof 与对象的数值属性

在使用对象的数值属性时,我们也可以使用 keyof 关键字。请记住,如果我们定义一个带有数值属性的对象,那么我们既需要定义该属性,又需要使用数组语法访问该属性, 如下所示:

class ClassWithNumericProperty {  [1]: string = "Semlinker";}let classWithNumeric = new ClassWithNumericProperty();console.log(`${classWithNumeric[1]} `);

下面我们来举个示例,介绍一下在含有数值属性的对象中,如何使用 keyof 操作符来安全地访问对象的属性:

enum Currency {  CNY = 6,  EUR = 8,  USD = 10}const CurrencyName = {  [Currency.CNY]: "人民币",  [Currency.EUR]: "欧元",  [Currency.USD]: "美元"};console.log(`CurrencyName[Currency.CNY] = ${CurrencyName[Currency.CNY]}`);console.log(`CurrencyName[36] = ${CurrencyName[6]}`);

上面的代码中,首先定义了一个 Currency 枚举用于表示三种货币类型,接着定义一个 CurrencyName 对象,该对象使用数值属性作为键,对应的值是该货币类型的名称。该代码成功运行后,控制台会输出以下结果:

CurrencyName[Currency.CNY] = 人民币CurrencyName[36] = 人民币

为了方便用户能根据货币类型来获取对应的货币名称,我们来定义一个 getCurrencyName 函数,具体实现如下:

function getCurrencyName<T, K extends keyof T>(key: K, map: T): T[K] {  return map[key];}console.log(`name = ${getCurrencyName(Currency.CNY, CurrencyName)}`);

同样,getCurrencyName 函数和前面介绍的 prop 函数一样,使用了泛型和泛型约束,从而来保证属性的安全访问。最后,我们来简单介绍一下 keyof 与 typeof 操作符如何配合使用。

四、keyof 与 typeof 操作符

typeof 操作符用于获取变量的类型。因此这个操作符的后面接的始终是一个变量,且需要运用到类型定义当中。为了方便大家理解,我们来举一个具体的示例:

type Person = {  name: string;  age: number;}let man: Person = {  name: "Semlinker",  age: 30}type Human = typeof man;

了解完 typeof 和 keyof 操作符的作用,我们来举个例子,介绍一下它们如何结合在一起使用:

const COLORS = {  red: 'red',  blue: 'blue'}// 首先通过typeof操作符获取color变量的类型,然后通过keyof操作符获取该类型的所有键,// 即字符串字面量联合类型 'red' | 'blue'type Colors = keyof typeof COLORS let color: Colors;color = 'red' // Okcolor = 'blue' // Ok// Type '"yellow"' is not assignable to type '"red" | "blue"'.color = 'yellow' // Error

最后留到思考题,有兴趣的小伙伴可以想一想:

interface StringIndexArray {  [index: string]: string;}interface NumberIndexArray {  [index: number]: string;}type K1 = keyof StringIndexArray // type K1 = string | numbertype K2 = keyof NumberIndexArray // type K2 = number

到此,关于“typescript中keyof与typeof操作符怎么使用”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

--结束END--

本文标题: typescript中keyof与typeof操作符怎么使用

本文链接: https://lsjlt.com/news/341700.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • typescript中keyof与typeof操作符怎么使用
    这篇文章主要介绍“typescript中keyof与typeof操作符怎么使用”,在日常操作中,相信很多人在typescript中keyof与typeof操作符怎么使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家...
    99+
    2023-07-02
  • 浅谈typescript中keyof与typeof操作符用法
    目录一、keyof 简介二、keyof 的作用三、keyof 与对象的数值属性四、keyof 与 typeof 操作符一、keyof 简介 TypeScript 允许我们遍历某种类型...
    99+
    2024-04-02
  • TypeScript基本类型之typeof和keyof怎么使用
    本文小编为大家详细介绍“TypeScript基本类型之typeof和keyof怎么使用”,内容详细,步骤清晰,细节处理妥当,希望这篇“TypeScript基本类型之typeof和keyof怎么使用”文章能帮助大家解决疑惑,下面跟着小编的思路...
    99+
    2023-07-05
  • JavaScript的typeof操作符怎么使用
    本篇内容介绍了“JavaScript的typeof操作符怎么使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所...
    99+
    2024-04-02
  • JavaScript typeof运算符怎么使用
    这篇文章主要讲解了“JavaScript typeof运算符怎么使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“JavaScript typeof运算符怎...
    99+
    2024-04-02
  • JavaScript中rxjs与Observable操作符怎么使用
    这篇文章主要讲解了“JavaScript中rxjs与Observable操作符怎么使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“JavaScript中rxjs与Observable操作符...
    99+
    2023-07-02
  • 使用Kotlin怎么实现操作符与操作符重载
    这篇文章将为大家详细讲解有关使用Kotlin怎么实现操作符与操作符重载,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。Kotlin基础教程之操作符与操作符重载Kotlin操作符的使用方法与其他...
    99+
    2023-05-31
    kotlin 操作符重载 操作符
  • 怎么使用JS中new操作符
    这篇文章主要讲解了“怎么使用JS中new操作符”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么使用JS中new操作符”吧!首先我们来看一下实例化一个对象做...
    99+
    2024-04-02
  • python中取反操作符怎么使用
    这篇文章主要介绍了python中取反操作符怎么使用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇python中取反操作符怎么使用文章都会有所收获,下面我们一起来看看吧。python取反操作符~ : 按位取反运算...
    99+
    2023-07-05
  • PHP7中怎么使用太空船操作符
    这篇文章给大家分享的是有关PHP7中怎么使用太空船操作符的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。1.定义太空船操作符又被称为组合比较运算符或者结合比较符,它使用符号 <=> 表示,该操作符可以用...
    99+
    2023-06-14
  • LINQ排序操作符怎么使用
    这篇文章主要介绍了LINQ排序操作符怎么使用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇LINQ排序操作符怎么使用文章都会有所收获,下面我们一起来看看吧。Linq中的排序操作符包括OrderBy、OrderB...
    99+
    2023-06-29
  • C++逻辑操作符怎么使用
    本篇内容主要讲解“C++逻辑操作符怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C++逻辑操作符怎么使用”吧!一、逻辑运算符的原生语义操作数只有两种值( true和 false )逻辑表...
    99+
    2023-06-30
  • 怎么使用MySQL中“&lt;=&gt;”操作符
    这篇文章将为大家详细讲解有关怎么使用MySQL中“&lt;=&gt;”操作符,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。问题 :我在看以前的一个开发者的...
    99+
    2024-04-02
  • JavaScript中怎么使用操作符和表达式
    这期内容当中小编将会给大家带来有关JavaScript中怎么使用操作符和表达式,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。一、一元操作符1.delete操作符delet...
    99+
    2024-04-02
  • Python中怎么使用in和not in操作符
    在Python中,可以使用in和not in操作符来检查一个元素是否存在于一个集合中。 例如,我们可以这样使用in操作符来检查一个元...
    99+
    2024-04-03
    Python
  • JavaScript中逗号操作符怎么用
    小编给大家分享一下JavaScript中逗号操作符怎么用,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!逗号操作符var ...
    99+
    2024-04-02
  • linq中聚合操作符怎么用
    这篇文章给大家分享的是有关linq中聚合操作符怎么用的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一、Aggregate操作符Aggregate操作符对集合值执行自定义聚合运算。来看看Aggregate的定义:p...
    99+
    2023-06-29
  • 使用SQL中的MINUS操作符
    SQL中MINUS的用法及具体代码示例 在SQL中,MINUS是一种用于在两个结果集之间执行差集操作的运算符。它用于从第一个结果集中删除与第二个结果集中相同的行。MINUS操作符返回的...
    99+
    2024-02-22
    插入
  • C语言操作符++和--怎么使用
    本篇内容介绍了“C语言操作符++和--怎么使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、++与--操作符的本质++ 和 -- 操作符...
    99+
    2023-06-30
  • JavaScript变量与操作符的使用方法
    今天小编给大家分享一下JavaScript变量与操作符的使用方法的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作