Typescript类型运算符、关键字以及内置高级类型

目录

类型运算符

|运算符

&运算符

类型关键字

Infer

示例

extends

typeof

keyof

in

注意

内置高级类型

类型

PropertyKey

ArrayBufferLike

对类型集合的操作

Exclude,>

Extract,>

对类型的操作

NonNullable

Readonly

Required

Partial 

Pick ,>

Omit,>

Record

 对字符串类型的操作

Uppercase

Lowercase

 Capitalize

Uncapitalize

对函数、类、Promise类型的操作

ThisParameterType

OmitThisParameter

Parameters

ConstructorParameters

ReturnType

InstanceType

Awaited


类型运算符

|运算符

或连接表示需要满足其中一种类型

type Name1 = { name: string; }
type User1 = Name1 | { age: number; } //type User = {name: string}|{ age: number;}
let user1: User1 = { name: 'yf' } // 只需要满足其中一个类型

&运算符

与连接表示需要同时满足两个类型

type Name2 = { name: string; }
type User2 = Name2 & { age: number; } // type User = {name: string; age: number;}
let user2: User1 = { name: 'yf', age: 18 } // 两个类型需要都满足 

类型关键字

Infer

表示在 extends 条件语句中以占位符出现的用来修饰数据类型的关键字,被修饰的数据类型等到使用时才能被推断出来

示例

// 定义了一个接口Customer,它描述了一个具有name(字符串类型)和moneyPaid(数字类型)属性的对象
interface Customer {name: stringmoneyPaid: number
}
// 定义了一个函数类型,接收一个Customer类型的参数并返回一个字符串
type custFuncType = (cust: Customer) => string
// 定义了一个泛型类型inferType<T>,这是理解的重点。这是一个条件类型,它使用了infer关键字,这里是一个三元判断返回类型P或T
// 表示传入的T如果是函数且只有1个参数则返回参数的类型,否则返回函数本身
type inferType<T> = T extends (params: infer P) => any ? P : T 
// 定义了inferResultType类型别名,它是通过将前面定义的custFuncType类型作为参数传递给inferType得到的
type inferResultType = inferType<custFuncType> // type inferResultType = Customer
let inferVariable: inferResultType = { name: "yf", moneyPaid: 9999 };
//如果custFuncType的函数没有参数,这里的inferResultType相当于any

extends

1.用于类型集合表示A extends B,表示A是B中的一个子类型。

2.用于类A extends B表示,B类中的属性在A类中需要被实现(A>B)。

type MyExtends = b extends bb ? 1 : 2 
//bb中的say属性在b类中没有被实现,所以返回三元中false的项即 type MyExtends1 = 2
type MyExtends1 = number extends number|string ? 1 : 2 // type MyExtends1 = 1

typeof

可以将变量转化为类型

function square(a: number) { return a * a }
type squareType = typeof square;//type squareType = (a: number) => number

keyof

返回对象类型属性名的集合

type Man = {name: string;age: number;
}
type MyKeyof = keyof Man // type MyKeyof = "name" | "age"

in

用于循环对象类型的属性名,创建新对象属性

type StringifyProperty = {[P in 'name'|'age']: string;};
//type StringifyProperty = {name: string;age: string;}

注意

1.void类型对应null和undefined

2.对函数参数、数组的类型定义不约束参数的名字,只约束指定位置的类型

3.类型定义时,函数中的第一个参数可以用来定义函数中的this类型,在使用时会判断函数中的this是否符合要求。

let thisFun = function (this: { name: String }, a: number) { console.log(a); console.log(this, 11) };
// thisFun(1,"2") 报错,因为this为undefined,没有name属性。
let thisObj = { name: "yf", moneyPaid: 9999, thisFun };
thisObj.thisFun(1) //这里this为thisObj包含name属性且为字符串所以不会报错。

内置高级类型

类型

PropertyKey

type PropertyKey = string | number | symbol;

定义对象的属性可以为哪些类型值。 

ArrayBufferLike

type ArrayBufferLike = ArrayBufferTypes[keyof ArrayBufferTypes];

 返回ArrayBuffer类型对象,需要有byteLength,slice,[Symbol.toStringTag]属性

// 定义一个符合ArrayBufferLike接口的自定义对象
const customBufferLike: ArrayBufferLike = {byteLength: 10,slice: function (start, end) {// 实现slice方法,这里只是一个简单的示例// 实际的slice方法需要返回原始buffer的一个新的slicereturn this.subarray(start, end) // 假设subarray方法已经实现},[Symbol.toStringTag]: "aaa"
};
console.log(customBufferLike.toString()) //'[object aaa]'

对类型集合的操作

Exclude<T, U>

type Exclude<T, U> = T extends U ? never : T;

T中包含U属性则返回never,不包含则返回T。即从T类型集合中排除U类型后的集合

type MyExclude = Exclude<string | number | boolean, string> 
// type MyExclude = number | boolean

Extract<T, U>

type Extract<T, U> = T extends U ? T : never;

T中包含U属性则返回U,不包含则返回never。即从T类型集合中抽取U类型后的集合

type MyExtract = Extract<string | number | boolean, string> 
//type MyExtract = string

对类型的操作

NonNullable<T>

type NonNullable<T> = T & {};

如果T对象类型为null或者undefined则返回never,其它返回T。

type MyNonNullable = NonNullable<null> // type MyNonNullable = never

Readonly<T>

type Readonly<T> = {readonly [P in keyof T]: T[P];
};

将T类型中所有属性都设置为只读属性

interface Person {name?: string;age?: number;
}
type ReadonlyPerson = Readonly<Person>;
//type PartialPerson = {readonly name?: string;readonly age?: number;}

Required<T>

type Required<T> = {[P in keyof T]-?: T[P];
};

将T类型下的所有属性都设置为必选的 

interface Person {name?: string;age?: number;
}
type RequiredPerson = Required<Person>;
//type PartialPerson = {name: string; age: number;}

Partial<T> 

type Partial<T> = {[P in keyof T]?: T[P];
};

将T类型下的所有属性都设置为可选类型 。

interface Person {name: string;age: number;
}
type PartialPerson = Partial<Person>;
//type PartialPerson = {name?: string; age?: number;}

Pick<T, K > 

type Pick<T, K extends keyof T> = {[P in K]: T[P];
};

 选取T类型中的部分属性,不改变属性的要求返回。

interface Person {name?: string;age?: number;gender: string;
}
type MyPick = Pick<Person, "name" | "age"> 
// type MyPick = { name?: string;age?: number;}

Omit<T, K >

type Omit<T, K extends keyof any> = Pick<T, Exclude<keyof T, K>>;

从T对象类型中删除K属性。

interface Person {name?: string;age?: number;gender: string;
}
type MyOmit = Omit<Person, "name">  
// type MyOmit = {age?: number;gender: string;}

Record<K , T>

type Record<K extends keyof any, T> = {[P in K]: T;
};

返回新的类型对象,该对象中的属性为K类型集合中的每个类型,对应的每个值都为T类型。

interface Person {name?: string;age?: number;gender: string;
}
type MyRecord = Record<"name" | "color", Person> 
// type MyRecord = {name: Person4;color: Person;}

 对字符串类型的操作

Uppercase<S>

type Uppercase<S extends string> = intrinsic;

将StringType转为大写,TS以内置关键字intrinsic来通过编译期来实现。 

type MyUppercase = Uppercase<"yf"> 
// type MyUppercase = "YF"

Lowercase<S>

type Lowercase<S extends string> = intrinsic;

将StringType转为小写,TS以内置关键字intrinsic来通过编译期来实现。

type MyLowercase = Lowercase<"YF" | "HH"> 
// type MyLowercase = "yf" | "hh"

 Capitalize<S>

type Capitalize<S extends string> = intrinsic;

将StringType的第一个字符转为大写,TS以内置关键字intrinsic来通过编译期来实现。

type MyCapitalize = Capitalize<"yf" | "hh"> 
// type MyCapitalize = "Yf" | "Hh"

Uncapitalize<S>

type Uncapitalize<S extends string> = intrinsic;

将StringType的第一个字符转为小写,TS以内置关键字intrinsic来通过编译期来实现。

type MyUncapitalize = Uncapitalize<"YF" | "HH"> 
// type MyUncapitalize = "yF" | "hH"

对函数、类、Promise类型的操作

ThisParameterType<T>

type ThisParameterType<T> = T extends (this: infer U, ...args: never) => any ? U : unknown;

ThisParameterType表示提取函数中的this类型,如果没有this或传入的T不为函数返回unknown类型

type MyThisParameterType = ThisParameterType<(this: Number, x: number) => void>;// T = Number

OmitThisParameter<T>

type OmitThisParameter<T> = unknown extends ThisParameterType<T> ? T : T extends (...args: infer A) => infer R ? (...args: A) => R : T;

OmitThisParameter表示删除函数T中的this参数返回。

即如果ThisParameterType<T>返回为unknown则直接返回T,如果不为unknown则返回删除T函数中对函数参数的this变量的约束

function toBinary(this: Number) {return this.toString(2);
}
let five2Binary: OmitThisParameter<typeof toBinary> = toBinary.bind(8);
//OmitThisParameter<typeof toBinary>返回 () => string

Parameters<T >

type Parameters<T extends (...args: any) => any> = T extends (...args: infer P) => any ? P : never;

如果T是一个函数则返回函数参数中数组以及数组每一位对应值的类型,否则为never。即获取函数T的参数类型。

type MyParameters = Parameters<(this: number, x: number, y: string) => void>; 
// type MyParameters = [x: number, y: string]
let variableParameters: MyParameters = [1, 'a']

ConstructorParameters<T >

type ConstructorParameters<T extends abstract new (...args: any) => any> = T extends abstract new (...args: infer P) => any ? P : never;

如果T是一个类类型则返回该类中构造函数参数中数组以及数组每一位对应值的类型,否则为never。获取T类中构造函数的参数类型

interface IAnimal {new(name: string, age: number)
}
type MyConstructorParameters = ConstructorParameters<IAnimal> 
// type MyConstructorParameters = [name: string, age: number]

ReturnType<T >

type ReturnType<T extends (...args: any) => any> = T extends (...args: any) => infer R ? R : any;

如果T是一个函数则返回函数参数中数组以及数组每一位对应值的类型,否则为never。即获取函数T的返回值类型。

type MyReturnType = ReturnType<(this: number, x: number) => void> 
// type MyReturnType = void

InstanceType<T >

type InstanceType<T extends abstract new (...args: any) => any> = T extends abstract new (...args: any) => infer R ? R : any;

如果T是一个类类型则返回该类中构造函数返回的类型,否则为any。获取T类构造函数的返回值类型,即T的实例对象。

class MyClass {constructor(public name: string) { }
}
// 获取 MyClass 的实例类型
type MyInstanceType = InstanceType<typeof MyClass>;
// 使用 MyInstanceType 创建对象
const instance: MyInstanceType = new MyClass("World");

Awaited<T>

type Awaited<T> =T extends null | undefined ? T : // special case for `null | undefined` when not in `--strictNullChecks` modeT extends object & { then(onfulfilled: infer F, ...args: infer _): any } ? // `await` only unwraps object types with a callable `then`. Non-object types are not unwrappedF extends ((value: infer V, ...args: infer _) => any) ? // if the argument to `then` is callable, extracts the first argumentAwaited<V> : // recursively unwrap the valuenever : // the argument to `then` was not callableT; // non-object or non-thenable  

表示如果T为Promise函数则取出Promise函数中返回的内容,如果不是则返回T类型,可以相当于Awaited<T> = typeof T extends Promise<infer U> ? U : typeof T;

用于递归解包 Promise,模拟函数 await 或 .then() 方法的行为。

let aa = Promise.resolve('aa')
type AA = Awaited<typeof aa> //type AA = string

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/470072.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

管家婆财贸ERP BB059.银行流水导入对账

最低适用版本: C系列 22.8 插件简要功能说明: 系统支持按固定模板导入银行流水明细银行流水支持销售单、销售退货单快捷对账,按单生成收款单银行流水支持生成其他付款业务单据更多细节描述见下方详细文档插件操作视频: 进销存类定制插件--银行流水导入对账 插件详细功能文…

第8章利用CSS制作导航菜单

8.1 水平顶部导航栏 8.1.1 简单水平导航栏的设计与实现 <nav>标签是HTML5新增的文档结构标签&#xff0c;用于标即导航栏&#xff0c;以便后续与网站的其他其内容整合&#xff0c;使用常用<nav>标签在页面上创建导航栏菜单区域。 8.1.1.1导航栏的创建 <!DOC…

给查询业务添加redis缓存和缓存更新策略

目录 一、添加redis缓存的主要逻辑 二、代码 三、结果 四、缓存更新策略 五、代码 一、添加redis缓存的主要逻辑 在未添加缓存时&#xff0c;前端向后端发起查询请求时&#xff0c;后端收到请求就直接查数据库&#xff0c;它的速度如下&#xff1a; 其实速度也不慢&#…

【贪心算法】No.1---贪心算法(1)

文章目录 前言一、贪心算法&#xff1a;二、贪心算法示例&#xff1a;1.1 柠檬⽔找零1.2 将数组和减半的最少操作次数1.3 最⼤数1.4 摆动序列1.5 最⻓递增⼦序列1.6 递增的三元⼦序列 前言 &#x1f467;个人主页&#xff1a;小沈YO. &#x1f61a;小编介绍&#xff1a;欢迎来到…

无人机动力测试台如何快速外接第三方传感器

前言 动力测试台对于测试动力系统的拉力、扭矩、RPM 和效率至关重要。将传感器集成到您的测试中增加了另一层优化&#xff0c;可以将您的性能提升到一个新的水平。 在无人驾驶行业中&#xff0c;有充分的证据表明&#xff0c;从外部传感器收集数据可能具有挑战性。为了解决这…

【项目开发 | 跨域认证】JSON Web Token(JWT)

未经许可,不得转载。 文章目录 JWT设计背景:跨域认证JWT 原理JWT 结构JWT 使用方式注意JSON Web Token(缩写 JWT)是目前最流行的跨域认证解决方案,本文介绍它的原理、结构及用法。 JWT设计背景:跨域认证 互联网服务的用户认证流程是现代应用中的核心组成部分,通常的流程…

985研一学习日记 - 2024.11.12

一个人内耗&#xff0c;说明他活在过去&#xff1b;一个人焦虑&#xff0c;说明他活在未来。只有当一个人平静时&#xff0c;他才活在现在。 日常 1、起床6:00√ 2、健身2h 3、LeetCode刷了4题 无重叠区间 对于贪心算法&#xff0c;可以先对数组进行排序&#xff0c;然后再…

数学建模模型算法-Python实现

一、评价决策类 1、层次分析法&#xff08;AHP&#xff09; 层次分析法用来评价或选择一个更好更优的决策或方案 通过找到可以衡量其好坏的指标&#xff0c;进而衡量指标&#xff0c;再形成评价体系 归一化处理 让指标在同一数量级&#xff0c;且保证在同一指标下其差距保持…

洞察鸿蒙生态,把握开发新机遇

随着科技的不断进步&#xff0c;鸿蒙系统以其独特的分布式架构和跨设备协同能力&#xff0c;逐渐在智能手机、智能穿戴、车载、家居等多个领域崭露头角&#xff0c;与安卓、iOS形成三足鼎立之势。作为一名开发者&#xff0c;我对鸿蒙生态的认知和了解如下&#xff1a; 一、鸿蒙…

uniapp打包华为,提示请提供64位版本软件包后再提交审核

HBuilder项目打包需要配置勾选arm64-v8a,默认只会集成armeabi-v7a

信捷 PLC C语言 POU 指示灯交替灭0.5秒亮0.5秒(保持型定时器)

1.在全局变量表中定义2个定时器变量timer_1,timer_2 名称 类型 timer_1 TMR_A_FB False -- False False timer_2 TMR_A_FB False -- False False ot2 BOOL False -- False False ot2表示指示灯 …

Apache ECharts

目录 1. 基本概念 1.1 ECharts的主要特点有&#xff1a; 1.2 ECharts的图形绘制方式&#xff1a; 2. 基本使用 3. 图表容器的大小 4. Option常用配置项 1. 基础配置项 title 标题组件 tooltip提示框组件 legend 图例组件 2.坐标配置项 grid网格组件 xAxis 直角坐标…

NVIDIA NIM 简介

NVIDIA NIM 简介 NVIDIA NIM 是一组易于使用的微服务&#xff0c;旨在加速在云、数据中心和工作站中部署生成式 AI 模型。NIM 按模型系列和每个模型分类。例如&#xff0c;用于大型语言模型 (LLM) 的 NVIDIA NIM 将最先进的 LLM 的强大功能带入企业应用程序&#xff0c;提供无…

常用中间件介绍

1. RabbitMQ RabbitMQ是一个基于AMQP&#xff08;Advanced Message Queuing Protocol&#xff0c;高级消息队列协议&#xff09;的开源消息代理软件&#xff0c;实现了面向消息的中间件。它支持消息持久化、队列、交换机&#xff08;Exchange&#xff09;和绑定&#xff08;Bin…

AI写作(四)预训练语言模型:开启 AI 写作新时代(4/10)

一、预训练语言模型概述 ​ 预训练语言模型在自然语言处理领域占据着至关重要的地位。它以其卓越的语言理解和生成能力&#xff0c;成为众多自然语言处理任务的关键工具。 预训练语言模型的发展历程丰富而曲折。从早期的神经网络语言模型开始&#xff0c;逐渐发展到如今的大规…

《云原生安全攻防》-- K8s安全防护思路

从本节课程开始&#xff0c;我们将正式进入防护篇。通过深入理解K8s提供的多种安全机制&#xff0c;从防守者的角度&#xff0c;运用K8s的安全最佳实践来保障K8s集群的安全。 在这个课程中&#xff0c;我们将学习以下内容&#xff1a; K8s安全防护思路&#xff1a;掌握K8s自身提…

LLM之模型评估:情感评估/EQ评估/幻觉评估等

如果您想知道如何确保 LLM 在您的特定任务上表现出色&#xff0c;本指南适合您&#xff01;它涵盖了评估模型的不同方法、设计您自己的评估的指南以及来自实践经验的技巧和窍门。 Human-like Affective Cognition in Foundation Models&#xff1a;情感认知评估 研究者们提出了…

【JavaEE进阶】导读

本节⽬标 了解什么是JavaEE 在JavaEE中, 我们学习什么, 如何学, 难点是什么 一、Java EE 发展历程 Java EE(Java Platform Enterprise Edition), Java 平台企业版. 是JavaSE的扩展, ⽤于解决企业级的开发需求, 所以也可以称之为是⼀组⽤于企业开发的Java技术标准. 所以, 学习…

【韩老师零基础30天学会Java 】07章 面向对象编程(基础)

第七章 面向对象编程&#xff08;基础&#xff09; 1. 类与成员方法 类与对象关系示意图 示例&#xff1a;代码 import java.util.Scanner;public class IntDetail{public static void main(String[] args){Cat cat1new Cat();cat1.name"小花";cat1.age12;cat1.co…

超子物联网HAL库笔记:定时器[外部模式]篇

超子物联网 HAL库学习 汇总入口&#xff1a; 超子物联网HAL库笔记&#xff1a;[汇总] 写作不易&#xff0c;如果您觉得写的不错&#xff0c;欢迎给博主来一波点赞、收藏~让博主更有动力吧&#xff01; 一、资源介绍&#xff1a;STM32F103C8T6定时器资源介绍 高级定时器&#x…