在 TypeScript 中有效地使用 keyof 和 typeof 来表示类型

这篇具有很好参考价值的文章主要介绍了在 TypeScript 中有效地使用 keyof 和 typeof 来表示类型。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

在本文中,我们将学习如何通过组合类型运算符和枚举来提取和声明常量类型typeof,以使您的代码库得到优化。keyof

先决条件

为了获得更好的编码体验,您应该在 IDE 中安装 TypeScript,例如VSCode。它将为您提供许多基本功能,例如错误突出显示、IntelliSense、linting 等...您还应该安装一些扩展,例如JavaScript 和 TypeScript Nightly、ESLint等。

什么是typeof

在 TypeScript 中,我们可以用来typeof提取变量或属性的类型,如下例所示:

``` const Name = { firstName: 'Maya', lastName: 'Shavin' };

let myName: typeof Name; ```

在上面的代码中,我们使用myName从变量 中提取的类型来声明变量Name,这将是一个具有两个属性 -firstName和 的对象lastName。当鼠标悬停myName在 IDE 中时,TypeScript 将向您显示myName结论的类型Name,如以下屏幕截图所示:

在 TypeScript 中有效地使用 keyof 和 typeof 来表示类型

这里注意typeof,如果要提取类型的变量是一个 Object,那么接收到的类型将是一个完整的类型结构,并且每个属性都有其类型(例如 type of 将有myName两个字段 - firstNameof typestringlastNameof kind string)。

另一个有价值的场景typeof是将其与ReturnType从函数中提取返回数据的类型结合起来。为此,我们执行以下操作:

  1. 使用以下方法获取声明函数的函数类型typeof
  2. 使用ReturnType<T>withT是步骤 1 中提取的类型来获取 from 的返回值类型T

下面的例子演示了如何提取返回类型decoupleName()

``` function decoupleName (name: string) { const [firstName, ...remaining] = name.split(" ");

return {
    firstName,
    lastName: remaining.reduce((text, word) => text ? `${text} ${word}` : word, '')
}

}

type NameObj = ReturnType ```

TypeScript 将自动引用正确的类型NameObj,如下面的屏幕截图所示:

在 TypeScript 中有效地使用 keyof 和 typeof 来表示类型

此外,我们可以typeof在 TypeScript 中用作条件块内的类型保护,就像在 JavaScript 中一样,尽管在这种情况下,它主要适用于stringobjectfunction等基本类型...

现在我们了解了typeof它的用法。接下来我们就来探讨一下keyof

理解keyof

虽然typeof生成由变量表示的类型,但keyof采用对象类型并生成作为该变量键的自由联合的类型,如下所示:

``` interface User { firstName: string; lastName: string; };

type UserKeys = keyof User ```

以上等同于以下声明:

type UserKeys = "firstName" | "lastName"

但是,与 不同的是typeof,您不能keyof直接在变量上使用。对于以下代码,TypeScript 将引发错误:

``` const Name = { firstName: 'Maya', lastName: 'Shavin' };

type NameKeys = keyof Name; //error ```

要从对象变量(例如常量值的对象映射)中提取类型,我们需要结合keyoftypeof,我们接下来将学习这一点。

从对象的键(或属性)中提取typeOf

以下面的ImageVariables为例,它充当修改图像时使用的变量的映射:

export const ImageVariables = { width: 'w', height: 'h', aspectRatio: 'ar', rotate: 'a', opacity: 'o', } as const;

请注意,这里我们需要const对象末尾的 来将其指示为只读。否则,TypeScript 将不允许我们从中提取类型,因为存在随时修改对象内部属性的风险。

ImageVariables包含从其键到根据Cloudinary 机制转换图像时使用的匹配变量符号的映射。要根据 的属性(或键)生成类型ImageVariables,我们执行以下操作:

  1. ImageVariables获取代表使用的类型typeof

type ImageVariablesType = typeof ImageVariables

  1. 根据类型的键提取新类型ImageVariablesType,使用keyof

type ImageFields = keyof ImageVariablesType

或者,我们可以将上述两个步骤合二为一,如下所示:

type ImageFields = keyof typeof ImageVariables

就是这样。我们现在有了ImageFieldstype,其中包含 的接受字段ImageVariables,如下面的屏幕截图所示:

在 TypeScript 中有效地使用 keyof 和 typeof 来表示类型

我们现在可以使用这个生成的类型,如下所示:

``` const transformImage = (field: ImageFields) => { const variable = ImageVariables[field]

//do something with it

} ```

通过基于 的属性声明类型ImageVariables,任何使用 的流程transformImage都是安全的,并且我们可以确保field传递的内容始终需要存在于 中ImageVariables。否则,TypeScript 将检测任何错误并向用户发出警报。

在 TypeScript 中有效地使用 keyof 和 typeof 来表示类型

此外,Intellisense 将告知用户可接受的值,限制传递错误值的可能性。

在 TypeScript 中有效地使用 keyof 和 typeof 来表示类型

顺便说一句,类型检查的行为与hasOwnProperty()运行时检查类似,尽管它只发生在编译时。

听起来很简单。如果我们想将键的值提取到ImageVariables新类型中怎么办?我们接下来看一下。

从对象的键(或属性)的值中提取typeof

如果我们想从 的键值生成一个类型ImageVariables,我们可以执行以下操作:

type VariableValues = typeof ImageVariables[ImageFields]

由于我们已经声明ImageVariablesType为 of 类型ImageVariables,因此我们可以将上面的内容重写为:

type VariableValues = ImageVariablesType[ImageFields]

通过上面的代码,我们现在有了一个新类型,VariableValues它接受以下值:

在 TypeScript 中有效地使用 keyof 和 typeof 来表示类型

从命名常量对象的值和键生成类型在许多情况下都是有利的,例如当您必须使用各种数据映射并且标准键或值在它们之间进行映射时。在对象映射上使用keyoftypeof可以帮助创建相关映射和类型之间的连接,从而避免潜在的错误。

或者,我们可以结合枚举 和typeof来实现相同的目标。

使用枚举

枚举是声明命名常量类型的一种方便且有组织的方式。它允许我们创建一组不同的常量值,并且每个枚举字段都是基于数字或基于字符串的。我们可以重写我们ImageVariables的如下:

enum EImageVariables { width = 'w', height = 'h', aspectRatio = 'ar', rotate = 'a', opacity = 'o', }

使用枚举的优点之一是我们可以使用枚举的名称作为接受值声明的类型。因此,代替以下代码:

``` type VariableValues = typeof ImageVariables[ImageFields]

function transform(value: VariableValues) { //perform something } ```

EImageVariables我们可以使用如下方式重写:

function transform(value: EImageVariables) { //perform something }

对于更少的代码,类型检查执行相同的操作。尽管如此,为了从声明的 enum 的键(或属性)获取类型,我们仍然需要像常规常量对象一样EImageVariables使用组合:keyof typeof

type ImageFields = keyof typeof EImageVariables

就是这样。上面的代码产生的结果与我们使用ImageVariables.

现在让我们回顾一下如何从常量对象的键和值获取类型:

``` export const ImageVariables = { width: 'w', height: 'h', aspectRatio: 'ar', rotate: 'a', opacity: 'o', } as const;

type ImageVariablesType = typeof ImageVariables; type ImageFields = keyof ImageVariablesType; type VariableValues = ImageVariablesType[ImageFields]; ```

与使用枚举相比:

``` enum EImageVariables { width = 'w', height = 'h', aspectRatio = 'ar', rotate = 'a', opacity = 'o', }

type EImageVariablesType = typeof EImageVariables; type EImageFields = keyof EImageVariablesType; //No need for getting the type of values ```

与常量对象一样,我们可以直接使用枚举键的值,例如EImageVariables.width在我们的代码中。在运行时,枚举作为 JavaScript 对象存在于编译后的代码中,并且表现得像 JavaScript 对象。

一般来说,枚举是可以的。在 TypeScript 中,由于其实现方式效率低下(希望这个问题已得到修复或会很短),许多人认为它对性能有影响。

那么我们应该使用它们吗?这取决于。这个选择由你。

概括

在使用 TypeScript 时,我们经常忽略类型运算符,例如typeof或 ,keyof因为它们太初级了。然而,它们在构建类型系统中发挥着重要作用。当正确结合其他 TypeScript 语法时,它们可以帮助您的应用程序开发高级和复杂的类型。让我们尝试一下它们,看看它们能为您带来什么。文章来源地址https://www.toymoban.com/news/detail-512211.html

到了这里,关于在 TypeScript 中有效地使用 keyof 和 typeof 来表示类型的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【TypeScript】类型推断与类型别名的使用方式。

    什么是类型推断? 在 TypeScript 中, 如果声明变量时, 没有明确的指定类型 ,那么 TypeScript 会依照类型推论(Type Inference)的规则推断出一个类型。 以下代码虽然 没有明确指定类型 ,但是会在编译的时候报错: 事实上,它等价于: TypeScript 会在没有明确的指定类型的时候,

    2024年02月16日
    浏览(36)
  • TypeScript类型系统:强类型的优势和使用方式

    在上一篇文章《TypeScript入门指南:从JS到TS的转变》 中,已经向大家说明了 TypeScript 是一种静态类型的编程语言,它的 类型系统 是它的重要特性之一。TypeScript 的类型系统可以提供一些强大的优势,可以帮助开发人员编写 更健壮 、 更可维护 和 更易于理解 的代码。 从这一

    2024年02月09日
    浏览(31)
  • 【TypeScript】接口类型 Interfaces 的使用理解

    导语 : 什么是 类型接口 ? 在面向对象语言中 ,接口 (Interfaces) 是一个很重要的概念,它是对行为的抽象,而具体如何行动需要由类(classes)去实现(implement)。TypeScript 中的 类型接口 是一个非常灵活的概念,除了可用于 对类的一部分行为进行抽象 以外,也常用于对「

    2024年02月15日
    浏览(37)
  • js判断类型:typeof Object.prototype.toString instanceof constructor有什么区别?一文讲清楚

    相信很多小伙伴在使用js的过程中,经常会需要对js的数据类型进行判断,而js中可以对数据类型进行判断的方法有很多种,最常见的有typeof、Object.prototype.toString、instanceof、constructor这四种,那么他们有什么区别呢? 目录 js数据类型 typeof 为啥typeof会将null判断为object Object.pr

    2024年02月11日
    浏览(24)
  • Buf 教程 - 使用 Protobuf 生成 Golang 代码和 Typescript 类型定义

    Buf 是一款更高效、开发者友好的 Protobuf API 管理工具,不仅支持代码生成,还支持插件和 Protobuf 格式化。 我们可以使用 Buf 替代原本基于 Protoc 的代码生成流程,一方面可以统一管理团队 Protoc 插件的版本、代码生成配置,另一方面可以简化项目开发配置。 本文将会用两部分

    2024年02月08日
    浏览(67)
  • TypeScript 联合类型,类型推断,类型断言

    取值可以为多种类型中的一个 当变量需要调用某属性的时候,有不确定当前的类型是什么,可以使用类型断言; 类型断言的两种方式: 1,类型 变量名; 2,值 as 类型; 没有明确的指定类型的情况下推断出一个类型;

    2024年02月15日
    浏览(28)
  • TypeScript高级类型:联合类型、交叉类型和类型别名

    TypeScript 是一门强类型语言,其高级类型功能使得开发者能够更加灵活地定义类型并对其进行操作,以便于更好地编写可维护和可扩展的代码。 在本文中,将着重讨论三种高级类型:联合类型、交叉类型和类型别名。我们将详细介绍这些类型,并且还会提供一些有用的代码示

    2024年02月10日
    浏览(29)
  • Typescript的类型推导与联合类型

    考虑以下 TypeScript 代码片段: 1、请解释 processInput 函数的作用和输入参数的类型。 2、解释变量 example1 和 example2 的类型注解。 3、描述 TypeScript 在调用 processInput(example1) 和 processInput(example2) 时是如何进行类型推导的。 解答: 1、processInput 函数接受一个参数 input,该参数的类

    2024年01月21日
    浏览(48)
  • 数据结构与算法之字符串: Leetcode 20. 有效的括号 (Typescript版)

    有效的括号 https://leetcode.cn/problems/valid-parentheses/ 描述 给定一个只包括 ‘(’,‘)’,‘{’,‘}’,‘[’,‘]’ 的字符串 s ,判断字符串是否有效。 有效字符串需满足: 左括号必须用相同类型的右括号闭合。 左括号必须以正确的顺序闭合。 每个右括号都有一个对应的相

    2024年02月01日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包