您当前的位置:首页 > 电脑百科 > 程序开发 > 语言 > javascript

一看就懂的TypeScript工具类型

时间:2023-05-12 15:48:51  来源:大转转FE  作者:



TypeScript是一种静态类型检查的编程语言,它内置了许多基本数据类型,如字符串、数字和布尔型等。除了基本数据类型,当某种类型对于大多数代码来说都非常有用时,它们就会被添加到TypeScript中并且被大家使用而无需担心它们的可用性。这些内置在TS中的类型我们称之为工具类型,这些工具类型位于TS安装目录typescript/lib/lib.es5.d.ts,熟悉这些工具类型,可以帮助我们提高开发效率。

Partial<T>、Required<T> 与 Readonly<T>

该组工具类型为改操作的工具类型,具体为将类型T的所有属性都改为可选、必选或只读。

定义:

/**
 * Make all properties in T optional
 */
type Partial<T> = {
    [P in keyof T]?: T[P];
};
/**
 * Make all properties in T required
 */
type Required<T> = {
    [P in keyof T]-?: T[P];
};
/**
 * Make all properties in T readonly
 */
type Readonly<T> = {
    readonly [P in keyof T]: T[P];
};

知识点:

in:关键字,用来实现遍历;

keyof:关键字,索引类型查询,用来获取类型的所有键,返回的类型是联合类型;

?:修饰符,表示可选属性;

readonly:修饰符,表示只读属性;

-:修饰符,添加在“?”或"readonly"修饰符之前,表示移除“?”或"readonly"修饰符。

作用:

Partial,将T类型中的所有属性变为可选属性; Required,将T类型中的所有属性变为必选属性; Readonly,将T类型中的所有属性变为只读属性。

应用:

interface Text {
  size: number
  color: string
}
type T = Partial<Text>
type R = Required<Text>
type O = Readonly<Text>

新定义的T类型中的属性均为Text类型属性,且均为可选;新定义的R类型中的属性均为Text类型属性,且均为必选;新定义的O类型中的属性均为Text类型属性,且均为只读。

Record<K,T>

该类型可视作增操作相关的工具类型,根据我们指定的键值类型,新增一个对象类型。

定义:

/**
 * Construct a type with a set of properties K of type T
 */
type Record<K extends keyof any, T> = {
    [P in K]: T;
};

知识点:

keyof any:上面介绍过keyof(关键字,用来获取类型的所有键,返回的类型是联合类型),当对any使用keyof索引类型查询时,结果类型为固定的联合类型“string | number | symbol”;

K extends keyof any:泛型约束,定义了类型K的最大范围为联合类型“string | number | symbol”。

作用:

根据给定的属性名类型和属性类型创建一个新的对象类型。

应用:

type K = 'size'|'color'
type T = number
type R = Record<K, T>

新定义的R类型,包括属性size和color,且类型均为number。

Exclude<T,U> 与 Extract<T,U>

该组类型可以视作查操作相关的工具类型,查出T类型中与U类型无关的属性或相关的属性。

定义:

/**
 * Exclude from T those types that are assignable to U
 */
type Exclude<T, U> = T extends U ? never : T;

/**
 * Extract from T those types that are assignable to U
 */
type Extract<T, U> = T extends U ? T : never;

知识点:

T extends U ? X : Y:条件类型,extends是关键字,若类型T能够赋值给类型U,则条件类型的结果为类型X,否则为类型Y。

作用:

根据条件类型的定义,Exclude类型中若T类型中的属性存在于U类型,则返回never,也就是从类型T中剔除所有类型U的属性。Extract则恰恰和Exclude相反,返回类型T和类型U的交集。

应用:

interface Text {
  size: number
  color: string
}
interface Img {
  width: number
  color: string
}
type T = Exclude<Text,Img>
type R = Extract<Text,Img>

新定义的T类型,只有size属性;新定义的R类型,只包含color属性。

Pick<T,K>、Omit<T,K>与NonNullable

该组工具类型为删操作相关的工具类型,包括剔除与指定键相关、无关或null、undefined类型操作的工具类型。

定义:

/**
 * From T, pick a set of properties whose keys are in the union K
 */
type Pick<T, K extends keyof T> = {
    [P in K]: T[P];
};
/**
 * Construct a type with the properties of T except for those in type K.
 */
type Omit<T, K extends keyof any> = Pick<T, Exclude<keyof T, K>>;
/**
 * Exclude null and undefined from T
 */
type NonNullable<T> = T extends null | undefined ? never : T;

作用:

Pick类型从已有对象类型T中选取选定的属性及其类型K创建新的类型。Omit与Pick类型相反,从已有对象类型T中剔除选定的属性及其类型K创建新的类型。NonNullable与Omit相似,返回的结果为从T类型中剔除null and undefined类型。

应用:

interface Text {
  size: number
  color: string
}
type T = Pick<Text,'size'>
type R = Omit<Text,'size'>
type N = NonNullable<Text|null|undefinde>

新定义的T类型,只包括Text类型中的属性size及其类型;新定义的T类型,只包括Text类型中的属性color及其类型;新定义的N类型,只包括Text类型。

Parameters、ConstructorParameters、ReturnType与InstanceType

该组工具类型为与函数相关的工具类型,包括获取普通函数参数和返回值的工具类型和获取构造函数参数和返回值的构造类型。

定义:

/**
 * ObtAIn the parameters of a function type in a tuple
 */
type Parameters<T extends (...args: any) => any> = T extends (...args: infer P) => any ? P : never;

/**
 * Obtain the parameters of a constructor function type in a tuple
 */
type ConstructorParameters<T extends new (...args: any) => any> = T extends new (...args: infer P) => any ? P : never;

/**
 * Obtain the return type of a function type
 */
type ReturnType<T extends (...args: any) => any> = T extends (...args: any) => infer R ? R : any;

/**
 * Obtain the return type of a constructor function type
 */
type InstanceType<T extends new (...args: any) => any> = T extends new (...args: any) => infer R ? R : any;

知识点:

infer:关键字,在extends条件类型语句(T extends U ?X : Y)中,允许在类型U的位置上使用关键字infer定义可推断的类型变量,可推断的类型变量只允许在类型X的位置上使用。简单应用如下,取出数组中的类型:

type ExtractArrayItemType<T> = T extends (infer U)[] ? U : T;
// 条件判断为 true,返回 U
type T = ExtractArrayItemType<string[]>; // string

作用:

Parameters工具类型能够获取函数类型的参数类型,并使用参数类型构造一个元组类型; ConstructorParameters工具类型可以把构造函数的参数类型作为一个元组类型返回;ReturnType工具类型可以获取函数的返回值类型; InstanceType工具类型可以获取构造函数的返回类型;

应用:

type Fn = (a: string, b: number) => string;
type FnParamTypes = Parameters(Fn);  // [string, number]
type FnReturnType = ReturnType(Fn); // string

interface FunctionConstructor {
  new(...args: string[]): Function;
  (...args: string[]): Function;
  readonly prototype: Function;
}

type ConstructorParamTypes = ConstructorParameters(FunctionConstructor) // string[]

type ConstructorInstanceType = InstanceType(FunctionConstructor) // Function

ThisParameterType、OmitThisParameter与ThisType

该组类型均为与this相关的工具类型。

定义:

/**
 * Extracts the type of the 'this' parameter of a function type, or 'unknown' if the function type has no 'this' parameter.
 */
type ThisParameterType<T> = T extends (this: infer U, ...args: any[]) => any ? U : unknown;

/**
 * Removes the 'this' parameter from a function type.
 */
type OmitThisParameter<T> = unknown extends ThisParameterType<T> ? T : T extends (...args: infer A) => infer R ? (...args: A) => R : T;
/**
 * Marker for contextual 'this' type
 */
interface ThisType<T> { }

知识点:

unknown:顶端类型,TypeScript中仅有any和unknown两种顶端类型,所有其他类型都可以赋值给两者,但unknown只能赋值给any类型和unknown类型。TypeScript中只有一个尾端类型never,是其他所有类型的子类型。

作用 ThisParameterType类型可以获取函数参数中this参数的类型;OmitThisParameter类型可以剔除函数参数中this参数的类型;ThisType类型可以对象字面量中this的类型。

应用

interface Foo {
    x: number
};

function fn(this: Foo) {}

type Test = ThisParameterType<typeof fn>; // Foo

type Fn = (this: Foo) => void

type NonReturnFn = OmitThisParameter<Fn>; // () => void

let obj: ThisType<{x: number, getX: () => number}>

obj = {
  x: 100,
  getX(){
    return this.x
  }
}

以上简单介绍了TypeScript中的自带工具类型,TypeScript与JAVAScript有相通之处,但又有更多的不同和背景知识,只有内化了这些知识同时不断地练习才能有效掌握这一门语言。



Tags:TypeScript   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
一篇文章搞懂TypeScript
TypeScript 是 JavaScript 的超集,一方面给动态类型的 js 增加了类型校验,另一方面扩展了 js 的各种功能。原始数据类型 字符串 数值 布尔 null undefined Symbol BigIntlet s...【详细内容】
2024-01-08  Search: TypeScript  点击:(78)  评论:(0)  加入收藏
TypeScript中的null和undefined的区别
在TypeScript中,null和undefined是两个特殊的值,用于表示变量的缺失或未定义。尽管它们在某些情况下可能看起来相似,并且都可以表示"没有值",但它们在语义和用法上存在一些重要...【详细内容】
2023-12-07  Search: TypeScript  点击:(135)  评论:(0)  加入收藏
为什么要在项目中使用TypeScript?
译者 | 李睿随着越来越多的开发人员采用TypeScript,人们需要了解在下一个项目中应该使用TypeScript的原因。尽管它在早期应用中遇到了一些阻力,但在过去十年,它迅速成为一种广...【详细内容】
2023-11-30  Search: TypeScript  点击:(164)  评论:(0)  加入收藏
一文读懂 TypeScript 泛型及应用
泛型是静态类型语言的基本特征,允许将类型作为参数传递给另一个类型、函数、或者其他结构。TypeScript 支持泛型作为将类型安全引入组件的一种方式。这些组件接受参数和返回...【详细内容】
2023-11-20  Search: TypeScript  点击:(195)  评论:(0)  加入收藏
TypeScript 5.3 来了,一大波新特性
根据 TypeScript 路线图,TypeScript 5.3 计划于 11 月 14 日发布。下面是该版本带来的新特性: 导入属性 导入类型中稳定支持 resolution-mode 所有模块模式均支持 resolution-...【详细内容】
2023-11-16  Search: TypeScript  点击:(155)  评论:(0)  加入收藏
万字详解 TypeScript 高级用法
TypeScript 是一种类型安全的 JavaScript 超集,除了基本类型和对象类型之外,TypeScript 还提供了一些高级类型系统,使得我们可以更好地处理复杂的数据结构和业务逻辑。本文将深...【详细内容】
2023-10-31  Search: TypeScript  点击:(339)  评论:(0)  加入收藏
不要在Typescript中使用Function类型
原文链接:https://www.totaltypescript.com/dont-use-function-keyword-in-typescript翻译:一川在Typescript中不应该使用Function作为一个类型,因为它可以表示任何函数。通常,...【详细内容】
2023-09-27  Search: TypeScript  点击:(279)  评论:(0)  加入收藏
为什么选择 TypeScript,它有什么优点吗?
在当今快速发展的软件开发领域,TypeScript技术的重要性日益凸显。TypeScript是一种由微软开发的开源编程语言,它扩展了JavaScript,并为开发者提供了强大的静态类型检查。首先,Ty...【详细内容】
2023-09-22  Search: TypeScript  点击:(191)  评论:(0)  加入收藏
掌握TypeScript,开启高质量前端之旅
相信TypeScript对于一个前端开发来讲应该是不陌生的,因为作为一个前端开发者来说,不是在学习如何使用TS就是在去学习TS如何使用的路上。为什么这么说呢?一些技术的发展离不开人...【详细内容】
2023-09-22  Search: TypeScript  点击:(283)  评论:(0)  加入收藏
反驳来了!放弃TypeScript?说明你无知!
作者 | Robert Vitonsky编译 | 云中 几天前,汉森 (David Heinemeier Hansson)宣布 Turbo8 即将放弃 TypeScript。我心想:放弃就放弃吧,反正我也不知道 Turbo 8 是什么鬼。 然而...【详细内容】
2023-09-15  Search: TypeScript  点击:(232)  评论:(0)  加入收藏
▌简易百科推荐
17 个你需要知道的 JavaScript 优化技巧
你可能一直在使用JavaScript搞开发,但很多时候你可能对它提供的最新功能并不感冒,尽管这些功能在无需编写额外代码的情况下就可以解决你的问题。作为前端开发人员,我们必须了解...【详细内容】
2024-04-03  前端新世界  微信公众号  Tags:JavaScript   点击:(5)  评论:(0)  加入收藏
你不可不知的 15 个 JavaScript 小贴士
在掌握如何编写JavaScript代码之后,那么就进阶到实践&mdash;&mdash;如何真正地解决问题。我们需要更改JS代码使其更简单、更易于阅读,因为这样的程序更易于团队成员之间紧密协...【详细内容】
2024-03-21  前端新世界  微信公众号  Tags:JavaScript   点击:(27)  评论:(0)  加入收藏
又出新JS运行时了!JS运行时大盘点
Node.js是基于Google V8引擎的JavaScript运行时,以非阻塞I/O和事件驱动架构为特色,实现全栈开发。它跨平台且拥有丰富的生态系统,但也面临安全性、TypeScript支持和性能等挑战...【详细内容】
2024-03-21  前端充电宝  微信公众号  Tags:JS   点击:(25)  评论:(0)  加入收藏
构建一个通用灵活的JavaScript插件系统?看完你也会!
在软件开发中,插件系统为应用程序提供了巨大的灵活性和可扩展性。它们允许开发者在不修改核心代码的情况下扩展和定制应用程序的功能。本文将详细介绍如何构建一个灵活的Java...【详细内容】
2024-03-20  前端历险记  微信公众号  Tags:JavaScript   点击:(20)  评论:(0)  加入收藏
对JavaScript代码压缩有什么好处?
对JavaScript代码进行压缩主要带来以下好处: 减小文件大小:通过移除代码中的空白符、换行符、注释,以及缩短变量名等方式,可以显著减小JavaScript文件的大小。这有助于减少网页...【详细内容】
2024-03-13  WangLiwen    Tags:JavaScript   点击:(2)  评论:(0)  加入收藏
跨端轻量JavaScript引擎的实现与探索
一、JavaScript 1.JavaScript语言JavaScript是ECMAScript的实现,由ECMA 39(欧洲计算机制造商协会39号技术委员会)负责制定ECMAScript标准。ECMAScript发展史: 2.JavaScript...【详细内容】
2024-03-12  京东云开发者    Tags:JavaScript   点击:(2)  评论:(0)  加入收藏
面向AI工程的五大JavaScript工具
令许多人惊讶的是,一向在Web开发领域中大放异彩的JavaScript在开发使用大语言模型(LLM)的应用程序方面同样大有价值。我们在本文中将介绍面向AI工程的五大工具,并为希望将LLM...【详细内容】
2024-02-06    51CTO  Tags:JavaScript   点击:(53)  评论:(0)  加入收藏
JS小知识,使用这6个小技巧,避免过多的使用 if 语句
最近在重构我的代码时,我注意到早期的代码使用了太多的 if 语句,达到了我以前从未见过的程度。这就是为什么我认为分享这些可以帮助我们避免使用过多 if 语句的简单技巧很重要...【详细内容】
2024-01-30  前端达人  今日头条  Tags:JS   点击:(56)  评论:(0)  加入收藏
18个JavaScript技巧:编写简洁高效的代码
本文翻译自 18 JavaScript Tips : You Should Know for Clean and Efficient Code,作者:Shefali, 略有删改。在这篇文章中,我将分享18个JavaScript技巧,以及一些你应该知道的示例...【详细内容】
2024-01-30  南城大前端  微信公众号  Tags:JavaScript   点击:(68)  评论:(0)  加入收藏
使用 JavaScript 清理我的 200GB iCloud,有了一个意外发现!
本文作者在综合成本因素之下,决定用 Java 脚本来清理一下自己的 iCloud,结果却有了一个意外发现,即在 iCloud 中上传同一个视频和删除此视频之后,iCloud 的空间并不一致,这到底是...【详细内容】
2024-01-11    CSDN  Tags:JavaScript   点击:(99)  评论:(0)  加入收藏
站内最新
站内热门
站内头条