ts相关笔记(extends、infer、Pick、Omit)
最近刷了本ts小册,对一些知识点做下笔记。
extends
extends 是一个关键字,用于对类型参数做一些约束。
A extends B 意味着 A 是 B 的子类型,比如下面是成立的
- ‘abc’ extends string
- 599 extends number
看下面例子:
type MyType<T extends number> = {value: T;
};const example: MyType<number> = {value: 42
};
联合类型子集均为联合类型的子类型,即 1、 1 | 2 是 1 | 2 | 3 | 4 的子类型
type MyType<T extends number | string> = {value: T;
};const example1: MyType<number> = {value: 42
};const example2: MyType<string> = {value: 'hello'
};
通过接口进行约束
interface MyInterface {length: number;
}type MyType<T extends MyInterface> = {data: T;
};const example: MyType<string> = {data: 'hello' // Error: 'string' does not satisfy the constraint 'MyInterface'
};const validExample: MyType<{ length: number }> = {data: { length: 5 }
};
根据传入的请求码判断请求是否成功
type ResStatus<ResCode extends number> = ResCode extends 10000 | 10001 | 10002? 'success': 'failure';type Res1 = ResStatus<10000>; // "success"
type Res2 = ResStatus<20000>; // "failure"type Res3 = ResStatus<'10000'>; // 类型“string”不满足约束“number”。
如果我们想让这个类型别名可以无需显式传入泛型参数也能调用,并且默认情况下是成功地,这样就可以为这个泛型参数声明一个默认值:
type ResStatus<ResCode extends number = 10000> = ResCode extends 10000 | 10001 | 10002? 'success': 'failure';type Res4 = ResStatus; // "success"
infer
通过 infer 关键字来在 条件类型 中提取类型的 某一部分信息
让 TypeScript 根据上下文自动推断出我们需要的类型,从而简化代码并让类型信息更具灵活性
看下面例子来理解
假设我们有一个条件类型 ExtractReturnType,它接受一个类型参数 T。我们希望当 T 是一个函数类型时,从这个函数类型中提取出它的返回值类型;当 T 不是函数类型时,返回never类型。
type ExtractReturnType<T> = T extends (...args: any[]) => infer R ? R : never;
function greet(): string {return 'Hello!';
}
现在,我们可以使用 ExtractReturnType 来推断 greet 函数的返回值类型,而不需要显式地声明它:
const result: ExtractReturnType<typeof greet> = 'Hello World';
ExtractReturnType 就会被推断为 string 类型 👇

TypeScript 内置的声明文件es5.d.ts中使用infer举例
-
获取函数类型中this的参数类型
type ThisParameterType<T> = T extends (this: infer U, ...args: never) => any ? U : unknown;class Person {name: string;constructor(name: string) {this.name = name;}getName(this: Person): string {return this.name;} }type testThisType = ThisParameterType<typeof Person.prototype.getName>; // Person -
从函数类型中移除 this 参数
type OmitThisParameter<T> = unknown extends ThisParameterType<T> ? T : T extends (...args: infer A) => infer R ? (...args: A) => R : T;function sayHello(this: { name: string }) {console.log(`Hello, ${this.name}!`); }type WithoutThisParam = OmitThisParameter<typeof sayHello>; // () => void
-
获取函数类型中参数的类型列表
type Parameters<T extends (...args: any) => any> = T extends (...args: infer P) => any ? P : never;function sum(a: number, b: number) {return a + b; }type SumParams = Parameters<typeof sum>; // [a: number, b: number]
Pick 和 Omit
都是对结构处理的工具类型,Pick 和 Omit 功能相反
先看一下源码实现
type Pick<T, K extends keyof T> = {[P in K]: T[P];
};type Omit<T, K extends keyof any> = Pick<T, Exclude<keyof T, K>>;
Pick,它接受两个泛型参数,第一个参数 T 即是我们会进行 结构处理 的 原类型(一般是对象类型),第二个参数 K 则是被约束为 T 类型的 键名联合类型 (就是第一个参数传一个对象,第二个参数传 对象的键 (key),最后获取到一个新对象类型)
Omit ,与Pick相反,Pick 是保留这些传入的键, Omit 则是移除这些传入的键取剩下的
使用举例
interface Foo {name: string;age: number;job: string;
}type PickedFoo = Pick<Foo, "name" | "age">
// 等同于
// type PickedFoo = {
// name: string;
// age: number;
// }
interface Foo {name: string;age: number;job: string;
}type OmitedFoo = Omit<Foo, 'name'>
// 等同于
// type OmitedFoo = {
// age: number;
// job: string;
// }
相关文章:
ts相关笔记(extends、infer、Pick、Omit)
最近刷了本ts小册,对一些知识点做下笔记。 extends extends 是一个关键字,用于对类型参数做一些约束。 A extends B 意味着 A 是 B 的子类型,比如下面是成立的 ‘abc’ extends string599 extends number 看下面例子: type …...
8.21 PowerBI系列之DAX函数专题-帕累托分析
需求 实现 1 按商品小类累积 var rollup_sales calculate(//计算当前累计销售额 [销售额], filter(allselected(order_2[产品小类]),sum(order_2[订单金额])<[销售额]) ) //按小类累积金额,filter内的销售额为选中的各小类的销售额 //金额从大到小累积,用&l…...
结构体-2-测试排名
22-结构体-2-测试排名 [命题人 : 外部导入] 时间限制 : 1.000 sec 内存限制 : 128 MB 题目描述 为了提升同学们的编程能力,老师们会在平时进行C语言的上机测试,了解班上同学的学习情况,对于一些测试成绩较差的同学,老师会进行督促…...
LeetCode刷题---快乐数
解题思路 该题的解题思路为使用哈希表来存储每次平方的和的结果,看是否有重复的数,如果存在第n次的平方和的数和第i次(i<n)平方和的数想等,那么它就不是一个快乐数。否则,则为快乐数。 代码实现: public boolean i…...
web前端游戏项目-辨色大比拼【附源码】
web前端游戏项目-辨色大比拼【附源码】 《辨色大比拼》是一个旨在测试和提升玩家颜色识别能力的在线游戏。在游戏中,玩家将通过辨识颜色来解谜并推进游戏进程。辨色大比拼也是一个寓教于乐的游戏,它不仅提供了一个有趣的辨色挑战,还能帮助玩…...
MongoDB操作_数据库_集合
.......................................................................................................................................................... 三、MongoDB操作 3.1 数据库操作 一个mongodb中可以建立多个数据库。 MongoDB的默认数据库为"test…...
50个免费的 AI 工具,提升工作效率(附网址)
上次我们已经介绍了20个精选的提高工作效率的免费AI工具,但如果你觉得这些AI工具还不过瘾的话,想进一步成为职场中最了解AI的人,本文将汇总介绍免费最新的50个AI工具。 DeepSwap DeepSwap 是一个基于 AI 的工具,适用于想要制作令人…...
g++ strip debug
strip(1) command_--strip-debug-CSDN博客 strip main.outll main.out -rwxr-xr-x 1 root root 6272 Mar 22 16:14 main.outfile main.out main.out: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, Bu…...
微服务实战系列之Dubbo(上)
前言 随着一年一度冬至的到来,2023的步伐也将远去。而博主的系列文章,也将从今天起,越来越聚焦如何构建微服务“内核”上。前序系列文章几乎囊括了微服务的方方面面,无论使用什么框架、组件或工具,皆可拿来用之。 那么…...
一篇讲透:箭头函数、普通函数有什么区别
前言 📫 大家好,我是南木元元,热衷分享有趣实用的文章,希望大家多多支持,一起进步! 🍅 个人主页:南木元元 目录 什么是箭头函数 箭头函数和普通函数的区别 更简洁的语法 箭头函数…...
第40节: Vue3 注册生命周期钩子
在UniApp中使用Vue3框架时,你可以注册生命周期钩子来执行特定的逻辑。以下是一个示例,演示了如何在UniApp中使用Vue3框架注册生命周期钩子: <template> <view> <p>{{ message }}</p> </view> </templ…...
docker给容器分配固定ip
1.为 Docker 容器设置一个固定的 IP 地址 要为 Docker 容器设置一个固定的 IP 地址,有几种常见的方法: 使用自定义网络和静态 IP 地址: 你可以创建一个自定义的 Docker 网络,并在这个网络上为容器分配静态 IP 地址。首先&#x…...
Hadoop入门学习笔记——二、在虚拟机里部署HDFS集群
视频课程地址:https://www.bilibili.com/video/BV1WY4y197g7 课程资料链接:https://pan.baidu.com/s/15KpnWeKpvExpKmOC8xjmtQ?pwd5ay8 Hadoop入门学习笔记(汇总) 目录 二、在虚拟机里部署HDFS集群2.1. 部署node1虚拟机2.2. 部…...
Spring之国际化:i18n
学习的最大理由是想摆脱平庸,早一天就多一份人生的精彩;迟一天就多一天平庸的困扰。各位小伙伴,如果您: 想系统/深入学习某技术知识点… 一个人摸索学习很难坚持,想组团高效学习… 想写博客但无从下手,急需…...
Java读取类路径下的JSON文件并转换为实体列表
使用 Jackson 库来读取类路径下的 JSON 文件并将其转换为对应实体列表。 在实际开发中可能在本地环境中需要调用别人的接口,别人的接口如果还没开发好或者本地环境不支持外部接口调用的时候,可以读取json文件来造数据,方便调试。 以Student…...
复分析——第1章——复分析准备知识(E.M. Stein R. Shakarchi)
第一章 复分析准备知识 (Preliminaries to Complex Analysis) The sweeping development of mathematics during the last two centuries is due in large part to the introduction of complex numbers; paradoxically, this is based on the seemingly absurd no…...
C++ 继承方式
C++ 继承方式 实验介绍 本章节将学习权限关键字的使用,并将一一举例验证 public、protected、private 的使用,学完本小节实验后将彻底掌握权限关键字的使用。 知识点 权限关键字使用位置继承中的权限关键字public 继承protected 继承private 继承权限关键字使用位置 示例…...
华为云Windows Server服务器下,Node使用pm2-logrotate分割pm2日志,解决pm2日志内存占用过高的问题。
一、简介 PM2 是一个守护进程管理器,它将帮助您管理和保持您的应用程序在线。PM2 入门很简单,它以简单直观的 CLI 形式提供,可通过 NPM 安装。官网地址:https://pm2.keymetrics.io/ 二、问题:pm2日志内存占用过高&am…...
web3风险投资公司之Electric Capital
文章目录 什么是 Electric CapitalElectric团队 Electric Capital 开发者报告参考 什么是 Electric Capital 官网:https://www.electriccapital.com/ 官方github:https://github.com/electric-capital Electric Capital 是一家投资于加密货币、区块链企…...
为什么员工都非常抵触「绩效考核」,该怎么办呢?
员工抵制绩效考核的原因可能有很多,其中一些常见的原因包括: 考核方式不公正:如果考核方式不够客观、公正,或者与员工的实际工作情况不符,员工就会对绩效考核产生不信任感,从而产生抵触情绪。 工作压力增大…...
LiuJuan20260223Zimage操作系统概念学习与实验环境
LiuJuan20260223Zimage:你的随身操作系统学习与实验环境 操作系统,听起来是不是有点高深莫测?内核、进程、内存、文件系统……这些概念在课本上总是显得抽象又遥远。很多朋友学操作系统原理时都有这样的困惑:理论都懂,…...
告别反复插拔SD卡:迪文DGUS II屏串口下载与仿真调试全攻略(附T5L实战技巧)
告别反复插拔SD卡:迪文DGUS II屏串口下载与仿真调试全攻略(附T5L实战技巧) 在工业控制、智能家居和物联网设备的开发中,迪文DGUS II系列串口屏因其高性价比和强大的组态功能,已成为众多开发者的首选。然而,…...
ADC0808搭配51单片机测电压:从芯片手册解读到量程切换逻辑的代码实现
ADC0808与51单片机电压测量系统:从芯片手册到智能量程切换的工程实践 在嵌入式系统开发中,精确的电压测量是许多应用的基础功能。ADC0808作为经典的8位模数转换器,与51单片机的组合曾是工业控制和仪器仪表领域的黄金搭档。本文将带您深入探索…...
Drone流水线进阶玩法:用.drone.yml实现多阶段构建+钉钉通知(2023最新版)
Drone流水线进阶实战:多阶段构建与智能通知全链路设计 当你的团队从单体架构转向微服务时,CI/CD流水线会突然变得复杂起来。上周我接手的一个电商项目就遇到了典型问题:每次代码提交后需要同时处理Java后端的Maven构建、前端Node.js打包、Doc…...
科哥Image-to-Video镜像实战:从零开始制作你的第一个AI视频
科哥Image-to-Video镜像实战:从零开始制作你的第一个AI视频 1. 前言:为什么选择科哥的Image-to-Video镜像? 想象一下,你有一张美丽的风景照片,如果能把它变成一段生动的视频该有多好?这就是Image-to-Vide…...
LiuJuan20260223Zimage新手必看:从CSDN博客文档到本地成功出图的避坑指南
LiuJuan20260223Zimage新手必看:从CSDN博客文档到本地成功出图的避坑指南 你是不是也遇到过这种情况?在CSDN上看到一个有趣的AI绘画模型,比如这个LiuJuan20260223Zimage,文档写得清清楚楚,但自己一上手部署࿰…...
DM数据库迁移实战:dimp与dexp版本兼容性问题解析与解决方案
1. 当DM数据库迁移遇上版本兼容性问题 最近在帮客户做DM数据库迁移时,遇到了一个典型问题:用高版本dexp导出的数据文件,无法用低版本dimp导入。这就像用最新版Word写的文档,用老版本打不开一样让人头疼。具体表现是执行导入命令时…...
解读大数据领域 OLAP 的分布式计算特性
解读大数据领域 OLAP 的分布式计算特性 关键词:OLAP、分布式计算、大数据、MPP架构、列式存储、查询优化、数据仓库 摘要:本文深入探讨OLAP(联机分析处理)在大数据环境下的分布式计算特性。我们将从OLAP的核心概念出发,分析其分布式架构设计原理,包括MPP架构、列式存储和并…...
Bidili Generator效果展示:宠物肖像生成——毛发细节+神态捕捉实测
Bidili Generator效果展示:宠物肖像生成——毛发细节神态捕捉实测 1. 引言:当AI遇见宠物肖像 你有没有想过,给自家宠物拍一张专业级的肖像照?不是那种随手一拍的生活照,而是能捕捉到它们独特神态、展现每一根毛发细节…...
GORM实战避坑指南:从‘小白’到‘老鸟’必须知道的10个细节(含MySQL连接配置)
GORM实战避坑指南:从‘小白’到‘老鸟’必须知道的10个细节(含MySQL连接配置) 1. MySQL连接配置的隐藏陷阱 charsetutf8mb4的必要性 MySQL默认的utf8编码只支持最多3字节的字符,而emoji表情等特殊字符需要4字节存储。若不指定utf8…...
