每日一题之TypeScript常用条件类型

TypeScript接口:从类型声明到工程契约的实战指南 TypeScript接口是前端工程中实现类型安全的核心机制,其本质远超语法层面的类型标注,而是将隐式业务约定转化为编译器可验证的显式契约。它通过静态类型检查,在开发阶段拦截字段拼写错误(如baseurl/baseUrl)、运行时undefined访问、隐式类型转换等高频缺陷,显著降低Vue 3 + TypeScript项目中因any泛滥或PropType模糊导致的运行时崩溃风险。在API响应建模、Pinia状态定义、自定义指令(如Arco Design loading指令)参数约束、组件Props声明及配置 阅读详情

Typescript 高阶类型

  • 索引类型 keyof 会提取interface中的key
class KeyCls {
  name: string
  age: number
}
type KeyClsExample1 = keyof KeyCls // name | age

function getParams(params: keyof KeyCls) {}

getParams('name') // 正常
getParams('age') // 正常
getParams('sex') // 报错
  • in 可以遍历枚举类型
type Keys = 'a' | 'b'
type Obj = {
  [p in Keys]: any;
}

// type Obj = {
//     a: any;
//     b: any;
// }
  • extends
type TExtends<T, U> = T extends U ? number : never;
type TExtendExample = TExtends<number, number | string> // number


// 联合类型, 表示如果T中的类型是U的子集, 那么返回never, 否则返回T, 这个过程可以理解为对T中的类型进行一次遍历, 每个类型都执行一次extends
type NonNullable1<T, U> = T extends U ? never : T
type NonExample = NonNullable1<null | string, null | undefined> // string
  • Pick 英文意思挑选, 也就是从某种类型中挑选出一个或多个属性
interface Todo {
  title: string
  desc: string
  Done: boolean
}

type TodoPreview = Pick<Todo, 'Done'>
// type TodoPreview = {
//     Done: boolean;
// }

// 实现
type MyPick<T, K extends keyof T = keyof T> = {
  [P in K]: T[P]
}
// K in extends keyof T = keyof T, 意思是取值必须是在T的key上面取, 如果不传递取值默认为keyof T,所有的key, 内部取值是如果传递了K, 则属性就在K中任意一个
  • Readonly 只读
interface Todo {
  title: string
  desc: string
  Done: boolean
}
const todo: Pick<Readonly<Todo>, 'title'> = {
  title: '你好'
}

todo.title = '啊啊啊'; // 无法为“title”赋值,因为它是只读属性

// 实现
type myReadonly<T> = {
  readonly [K in keyof T]: T[K]
}
// 分析: 通过keyof拿到所有的key属性值组成联合类型, 然后通过in遍历类型,在属性值前面加上readonly, 值value则是 T[K]

// 通过上面案例还可以实现可选类型

type myOptional<T> = {
  [K in keyof T]?: T[K]
}
  • Exclude 语法: Exclude<T, U>, 返回 T 中不存在于 U 的部分
// 回顾extends
// // 联合类型, 表示如果T中的类型是U的子集, 那么返回never, 否则返回T, 这个过程可以理解为对T中的类型进行一次遍历, 每个类型都执行一次extends
// type NonNullable1<T, U> = T extends U ? never : T
// type NonExample = NonNullable1<null | string, null | undefined> // string

// 自己实现Exclude
type myExclude<T, U> = T extends U ? never : T

// 测试
// 分析: 对T也就是'a'|'b'遍历, a extends 'a'|'b', 返回never, 'b', 'a'|'c',返回'b', 所以上面的返回'b'
type excludeExample = myExclude<'a' | 'b', 'a' | 'c'> // 'b'
  • Partial 将传入的属性变为可选项

interface Todo {
  title: string
  desc: string
  Done: boolean
}



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

type KeyOfExample1 = Partial<Todo>
let keyofEx1: KeyOfExample1 = {
  title: '1'
}
  • -? 将可选项代表的 ?去掉, 将该类型变成必选项, 与之对应的还有一个+?,是将可选项变成必选项

interface Todo {
  title: string
  desc: string
  Done: boolean
}

type Mutable<T> = {
  -readonly [P in keyof T]: T[P]
}

type mutableExample = Mutable<Readonly<Todo>>
// 将Todo变成可读之后再变成可写
  • Required 将传入的属性变成必选项
type Required<T> = {
  [P in keyof T]-?: T[P]
}

class KeyCls {
  name?: string;
  age?: number;
}

const requiredExample: Required<KeyCls> = {
  name: "John",
} // 报错
const requiredExample2: Required<KeyCls> = {
  name: "John",
  age: 20,
} // 正常
  • Record<K, T> 将K中所有的属性转化为T类型
type myRecord<K extends keyof any, T> = {
  [P in K]: T
}

enum Methods {
  GET = "get",
  POST = "post",
  DELETE = "delete",
  PUT = "put",
}

type IRouter = myRecord<Methods, (req: any, res: any) => void>

// type IRouter = {
//     get: (req: any, res: any) => void;
//     post: (req: any, res: any) => void;
//     delete: (req: any, res: any) => void;
//     put: (req: any, res: any) => void;
// }
  • Omit 排除某些字段
// 已经学习了Pick和Exclude, 则可以利用这两个实现Omit

class KeyCls {
  name: string;
  age: number;
}

// 假设 T 为 KeyCls, K为name, 结果是 
// type myOmit<KeyCls, 'name'>
// {  
//    age: number;  
// }

// 只需要实现成这样就行了, 也就是获取到age
type myOmit<T, K extends keyof T> = Pick<T, 'age'>

// 排除name, 按照上面的 Exclude<'name' | 'age', 'name'> // 'age'
type myOmit<T, K extends keyof T> = Pick<T, Exclude<keyof T, K>>

// 测试

type myOmitExample = myOmit<KeyCls, "name">;

// type myOmitExample = {  
//     age: number;  
// }
  • NonNullable:作用是去掉 T 中的 null 和 undefined。T 为字面量/具体类型的联合类型
// 4.8版本之前
type NonNullable<T> = T extends null | undefined ? never : T;
    
// 4.8版本之后
type NonNullable<T> = T & {}
  • infer 可以推荐一个类型变量, 相当于生命一个类型变量, 这个变量的类型取决于传入的泛型T
type F<T> = T extends () => infer R ? R : T;
type F1 = F<string> // string
type TObj<T> = T extends { name: infer V, age: infer U } ? V : T
type TObjExample2 = TObj<{
  name: number;
  age: string;
}>; // number;
  • ReturnType 获取函数返回值的类型
type ReturnType<T> = T extends (...args: any[]) => infer R ? R : any;
    
functin getUser() {
    return {
        name: 'xxx',
        age: 20
    }
}
    
type GetUserType = typeof getUser;
// type GetUserType = () => {
//   name: string;
//   age: number;
// }
    
type ReturnUser = ReturnType<GetUserType>
type ReturnUser = {
//   name: string;
//   age: number;
// }
前端面试集合-每日一题 HTML+CSS 简单说下你理解的语义化,怎样来保证你写的符合语义化?HTML5语义化标签了解下? DOCTYPE 的作用是什么 请描述下css盒模型基本概念 BFC是什么?触发BFC的条件是什么?有哪些应用场景? 布局都有什么方式,float和position有什么区别? CSS多列等高如何实现 说一下html布局元素的分类有哪些以描述下每种布局元素的应用场景么 displayposition和float的相互关系 margin和padding分别适合什么场景使用 说一 阅读详情

相关推荐

STM32 使用rtthread的DMA 串口发送失败

在一次使用RTthread的DMA 串口发送时,持续性通过DMA 发送串口数据时,偶发发送过程中后续数据包无法正常发送出去,后经查,发现为RT-Thread的串口中断处理有瑕疵,后做出修改。另,为了更方便的排查为题,建议修改。左为修改前,右为修改后。

qq_39294918的博客 1108

TypeScript 高级类型及用法

点击上方前端瓶子君,关注公众号回复算法,加入前端编程面试算法每日一题群本文详细介绍了 TypeScript 高级类型的使用场景,对日常 TypeScript 的使用可以提供一些帮助。前言...

我本可以容忍阳光,如果我不曾见过太阳,然而阳光已使我荒凉,成为更新的荒凉。 1546

RK3588平台开发系列讲解(项目篇)常见模型结构

📢 AI 模型常采用人工神经网络来模拟人脑神经的记忆和处理信号的能力。常见的人工神经网络类型有深度神经网络(Deep Neural Network,DNN)、卷积神经网络(Convolutional Neural Network,CNN)、循环神经网络(Recurrent Neural Network,RNN)等。

内核笔记 1756

盘点 TypeScript 中我们常用的那些神奇符号

点击上方三分钟学前端,关注公众号回复交流,加入前端编程面试算法每日一题群面试官也在看的前端面试资料?. 可选链(Optional Chaining)ES11(ES2020)新增的特性,T...

我本可以容忍阳光,如果我不曾见过太阳,然而阳光已使我荒凉,成为更新的荒凉。 1220

移动机器人路径规划中噪声环境下的鲁棒性测试仿真

设计一个二维或三维环境模型,包括静态障碍物和可能存在的动态障碍物。

amy_mhd的博客 125

【AI编程】Cursor编程工具使用教程:下载、配置、使用、运行Java项目

【AI编程】Cursor编程工具使用教程:下载、配置、使用、运行Java项目

funfan的博客 5196

使用 TypeScript 中的 any 类型前,你需要了解的一切

点击上方三分钟学前端,关注公众号回复交流,加入前端编程面试算法每日一题群面试官也在看的前端面试资料any在 TypeScript 中,任何类型的值都可以赋值给 any , any 也可以...

我本可以容忍阳光,如果我不曾见过太阳,然而阳光已使我荒凉,成为更新的荒凉。 8076

C# 实现 Modbus 通信全教程(支持 TCP 和 RTU,含完整错误处理)

环境准备:安装 NModbus4 库,明确设备参数(IP/串口、地址、数据类型);连接设备:TCP 用 TcpClient,RTU 用 SerialPort,注意超时和参数匹配;读写数据:根据数据类型调用对应方法(读保持寄存器用 ReadHoldingRegisters);错误处理:捕获连接、超时、协议等异常,针对性排查问题。掌握这些后,即可轻松实现与工业设备的 Modbus 通信,为上位机开发提供稳定的数据交互能力。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 2066

TypeScript类型体操:面试必备与实战解析

类型系统是现代编程语言的核心特性之一,它通过静态检查帮助开发者在编译时捕获潜在错误。TypeScript作为JavaScript的超集,其强大的类型系统支持泛型、条件类型等高级特性,能够实现类型层面的逻辑编程(即类型体操)。这种能力在前端工程化中尤为重要,尤其在构建可维护的大型应用时,类型安全与自动化推断能显著提升开发效率。通过组合基础类型操作符(如联合类型、映射类型)与infer等高级特性,开发者可以创建复杂的类型工具,例如深度只读(DeepReadonly)或参数提取(FirstParam)。这些技术不

weixin_30312563的博客 409

Vue - 解决报错 Error: Cannot find module ‘XXX\@vue\cli-service\bin\vue-cli-service.js‘(vue项目编译运行出错,启动失败)

vue报错,Error: Cannot find module ‘@vue\cli-service\bin\vue-cli-service.js‘,vue2项目启动报错,vue3项目运行出错,vue执行npm run serve报错,找不到@vue/cli-service模块,vue项目关于:Error: Cannot find module ‘D:\@vue\cli-service\bin\vue-cli-service.js‘的解决方案,vue项目跑不起来了,Vue项目报错,跑项目报错Cannot fi

🏆 前端领域优质创作者 3114

【即插即用模块】注意力篇 | TGRS 2025 | MFA聚特征+HPDown保细节+HFF融层级,三大模块各司其职,性能翻倍!

本文介绍了MTMLNet网络中的三大核心模块:MFA(多阶段特征聚合)、HPDown(混合池化下采样)和HFF(分层特征融合)。MFA通过双尺度深度卷积和注意力机制增强特征提取能力;HPDown结合平均池化和最大池化,有效保留下采样过程中的特征信息;HFF采用三注意力机制实现自适应特征融合。这三个模块协同工作,在红外小目标检测与分割任务中取得了SOTA效果。实验表明,各模块在特征提取、信息保留和融合方面均优于传统方法,可灵活应用于各类视觉任务中。

主要更新底层视觉(去噪、超分等)相关的科研内容,形式为【论文精读】+【论文复现】 285

typescript索引类型_Typescript 使用笔记

每日前端夜话第350篇本文转自公众号:前端日志作者:lmjben正文共:约 5000字预计阅读时间:10分钟最近这两年,有很多人都在讨论 Typescript,无论是社区还是各种文章都能看出来,整体来说正面的信息是大于负面的,这篇文章就来整理一下我所了解的 Typescript。本文主要分为 3 个部分:Typescript 基本概念Typescript 高级用法Typescript...

weixin_39968852的博客 472

MFC Windows 程序设计[105]之彩色滚动条(附源码)

MFC是微软公司提供的一个类库(class libraries),用以减少应用程序开发人员的工作量。其中包含大量Windows句柄封装类和很多Windows的内建控件和组件的封装类。有很多初学MFC的小伙伴们都觉得MFC比较难学,看书吧,看了就忘了,网上的一些教程又是写的含糊不清,故而学习起来很吃力...... 故此,本专栏亲自研究,实践,由易到难,层层深入,将调试过程中所遭所遇进行详细讲解,注意事项进行一一列举,希望能够帮助到各位初学MFC的小伙伴,避免走弯路,费时费力。

hnjzfwy的博客 518

TypeScript项目每日构建版本使用指南

在日常的TypeScript开发中,你是否遇到过这样的痛点: - 等待官方正式版发布周期太长,无法及时体验最新功能 - 遇到Bug需要紧急修复,但官方版本还未更新 - 想要提前测试新特性对现有项目的影响 - 作为库开发者,需要确保代码与最新TypeScript版本兼容 TypeScript每日构建版本(Nightly Builds)正是为解决这些问题而生。它让你能够在官方正式发布前,提前获取和...

gitblog_00362的博客 505

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

【每日一题】LeetCode 739. 每日温度 TypeScript

天,下一个更高温度出现在几天后。如果气温在这之后都不会升高,请在该位置用。,表示每天的温度,返回一个数组。

qq_69682052的博客 197

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

革命性TypeScript学习平台type-challenges:掌握高级类型系统

还在为TypeScript的高级类型特性感到困惑吗?想要真正掌握类型系统的强大能力却苦于缺乏系统性的练习?type-challenges项目正是你需要的革命性学习平台! 通过本文,你将获得: - ???? 深入理解TypeScript类型系统的核心机制 - ???? 掌握条件类型、映射类型、infer推断等高级技巧 - ???? 构建自己的类型工具库实战能力 - ???? 系统化的挑战难度分级和学习路径 - ?...

gitblog_01006的博客 737

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

前端必看!每日10个TypeScript实战技巧,让你代码起飞

作为前端工程师,TypeScript如今可是咱们的“神兵利器”,能帮我们写出更健壮、更易维护的代码。今天就来唠一唠10个超实用的TypeScript实战技巧,每一个都有详细代码和注释,看完直接就能上手,让你的代码在项目中“狂飙”,还能提升代码的SEO搜索率,让更多同行看到你的技术干货!

前端大白话 870

blob对应java什么类型_从两个角度理解 TypeScript 中的类型是什么

每日前端夜话第290篇翻译:疯狂的技术宅作者:Dr. Axel Rauschmayer来源:2ality.com正文共:1537字预计阅读时间:7 分钟TypeScript中的类型是什么?本文中描述了两种有助于理解它们的观点。每个角度三个问题以下三个问题对于理解类型如何工作非常重要,并且需要从两个角度分别回答。myVariable 具有 MyType 类型是什么意思?1letm...

weixin_30607173的博客 1329

【每日一题】LeetCode 169. 多数元素 TypeScript

for(const num in nums)遍历nums每一个索引,num输出字符型:"0"、"1"、"2"、"3"、"4"for(const per in person) 遍历nums的每一个键,per输出”name"、"age"for(const num of nums) 遍历nums每一个元素,num输出数字型:2,3,1,2,1。不推荐用for..in ..遍历数组,会遍历到数组的原型链上的属性。你可以假设数组是非空的,并且给定的数组总是存在多数元素。,返回其中的多数元素。

qq_69682052的博客 247

【每日一题】LeetCode 39. 组合总和 TypeScript

2 和 3 可以形成一组候选,2 + 2 + 3 = 7。注意 2 可以使用多次。如果至少一个数字的被选数量不同,则两种组合是不同的。7 也是一个候选, 7 = 7。,并以列表形式返回。中可以使数字和为目标数。对于给定的输入,保证和为。

qq_69682052的博客 230

【每日一题】LeetCode 146. LRU 缓存 TypeScript

Map里有该key,保存原来的value值,删掉原来的key键值对,再重新set把键值对存进Map,这里是让Map给set重新记录顺序。这是用内置的数据结构Map实现的,核心在于.set()方法可以记住插入的顺序,可以获取最早插入的元素。// 该操作会使得关键字 2 作废,缓存是 {1=1, 3=3}// 该操作会使得关键字 1 作废,缓存是 {4=4, 3=3}// 缓存是 {1=1, 2=2}// 返回 -1 (未找到)// 返回 -1 (未找到)lRUCache.put(1, 1);

qq_69682052的博客 257

【每日一题】LeetCode 189. 轮转数组 TypeScript

数组[1,2,3,4,5,6,7] k=10,轮转到7的时候就又是原来的数组了,实际再轮转3次。1.nums.splice(s):表示从数组的s索引(包含)开始删除剩下的元素并返回删除元素。为什么要取余数,因为轮转k的次数如果是数组的长度,则还是原来的数组,比如。②翻转前k-1的数据;4.[a,b]=[b,a]这个是快速替换a和b两个元素,等价于。3.k%=nl等价与k= k%nl。向右轮转 1 步: [99,-1,-100,3]向右轮转 2 步: [3,99,-1,-100],将数组中的元素向右轮转。

qq_69682052的博客 185

每日学习(Sass,TypeScript)

此系列文章用来记录我的学习历程。 今日任务: 1.Sass 2TypeScript Sass: 参考链接:Sass 教程 | 菜鸟教程 (runoob.com) 简介: Sass 是一个 CSS 预处理器。 Sass 是 CSS 扩展语言,可以帮助我们减少 CSS 重复的代码,节省开发时间。 Sass 完全兼容所有版本的 CSS。 Sass 扩展了 CSS3,增加了规则、变量、混入、选择器、继承、内置函数等等特性。 Sass 生成良好格式化的 CSS 代码,易于组织和维护。

weixin_52400878的博客 566

【每日一题】LeetCode 20. 有效的括号 TypeScript

判断字符串是否有效。

qq_69682052的博客 247

【每日一题】LeetCode 1. 两数之和 TypeScript

因为 nums[0] + nums[1] == 9 ,返回 [0, 1]。你可以假设每种输入只会对应一个答案,并且你不能使用两次相同的元素。整数,并返回它们的数组下标。你可以按任意顺序返回答案。,请你在该数组中找出。来个暴力解法O(n²)

qq_69682052的博客 230
上一篇: 每日一题之单例模式
下一篇: 每日一题之实现瀑布流
前端答疑解惑
博客等级 码龄4年 2粉丝 16原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值