最新要闻
- 今日热文:欧洲2035禁售燃油车!专家:电动车难完全取代燃油车
- 环球焦点!Wind11新预览版25300发布:实时字幕对中国用户更加友好!
- 当前时讯:新日登北京电动自行车不合格“黑榜”:多批电池管理系统有问题
- 新消息丨不愧是玩无人机的 大疆车载产品矩阵揭秘:高阶辅助只需摄像头
- 这合理吗?公厕免费取纸先关注微信公众号
- 重点聚焦!大疆Inspire 3无人机来了:配全画幅X9相机、可录8K视频
- 全球速递!用了电信5G 浙大完成中国首例5G超远程机器人肝胆手术:跨越近万里
- 总投资389亿!2023年第一条高铁获批:沿海超级通道定了
- 全球速讯:消息称腾讯XR团队全线解散:成立不到1年!
- 鄱阳湖旗舰店麻辣小龙虾官方大促:1.4 斤29.9元到手
- 深交所向新亚制程发出关注函
- 快看点丨西部数据推出22TB/44TB My Book桌面硬盘 售价高达1500美元
- 曝光交个朋友欠薪 当事人最新回应:罗永浩正积极联系公司解决
- 果粉买不?苹果折叠屏会先拿iPad试水!折叠iPhone风险太高了
- 当前热讯:想要过目不忘?进来学两招、保证不后悔!
- 世界热资讯!12.4万买帕纳梅拉梦碎 首单车主:保时捷傲慢 100万都不卖
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
记录--TS类型写不好?一起来训练提升吧!
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助
前期准备
本篇文章的编写目的是为了提升TS类型的书写质量,高质量的类型可以提高项目的可维护性并避免一些潜在的漏洞;
在学习本篇之前需要有一定的TS基础知识,在此基础上可以更好的完成各种类型的挑战,编写出属于自己的类型工具;
(资料图片)
这里推荐我之前梳理的基础知识点 一份够用的TS常用特性总结 或 TS中文文档 ;
目前只完成了easy类型和部分medium类型的训练,后续会持续补充;
easy
readonly
实现Readonly,接收一个泛型参数,并返回一个完全一样的类型,只是所有属性都会被readonly所修饰。
type MyReadonly= { readonly [P in keyof T] : T[P]}interface Todo { title: string; description: string;}const todoObj: MyReadonly = { title: "Hey", description: "foobar",};console.log(todoObj.title)todoObj.description = "barFoo"; // Error: cannot reassign a readonly property
first-of-array
实现First,他接受一个数组 T 并返回它的第一个元素类型
type First= T extends [] ? never : T[0];type arr1 = ["a", "b", "c"]type arr2 = [3, 2, 1]type head1 = First // expected to be "a"type head2 = First // expected to be 3
tuple-to-object
实现TupleToObject,传入元组类型,将元组类型转换为对象类型,这个对象类型的键/值都是从元组中遍历出来。
type TupleToObject= { [P in T[number]]: P;};const tuple = ["tesla", "model 3", "model X", "model Y"] as const;type result = TupleToObject ; // expected { tesla: "tesla", "model 3": "model 3", "model X": "model X", "model Y": "model Y"}
length of tuple
创建一个通用的Length,接受一个readonly的数组,返回这个数组的长度。
type Length= T["length"];type tesla = ["tesla", "model 3", "model X", "model Y"];type spaceX = [ "FALCON 9", "FALCON HEAVY", "DRAGON", "STARSHIP", "HUMAN SPACEFLIGHT"];type teslaLength = Length ; // expected 4type spaceXLength = Length ; // expected 5
Exclude
从联合类型T中排除U的类型成员,来构造一个新的类型。
type MyExclude= T extends U ? never : T;type Result = MyExclude<"a" | "b" | "c", "a">; // "b" | "c"
Awaited
假如我们有一个 Promise 对象,这个 Promise 对象会返回一个类型。在 TS 中,我们用 Promise 中的 T 来描述这个 Promise 返回的类型。请你实现一个类型,可以获取这个类型。 例如:Promise,请你返回 ExampleType 类型。
type MyAwaited= T extends PromiseLike ? MyAwaited : Ttype ExampleType = Promise type Results = MyAwaited // string
IF
实现一个 IF 类型,它接收一个条件类型 C ,一个判断为真时的返回类型 T ,以及一个判断为假时的返回类型 F。 C 只能是 true 或者 false, T 和 F 可以是任意类型。
type If= C extends true ? T : F;type A = If ; // expected to be "a"type B = If ; // expected to be "b"
Concat
在类型系统里实现 JavaScript 内置的 Array.concat 方法,这个类型接受两个参数,返回的新数组类型应该按照输入参数从左到右的顺序合并为一个新的数组。
type Concat= [...T, ...U];type ResultConcat = Concat<[1], [2]>; // expected to be [1, 2]
Include
实现 Array.includes 方法,这个类型接受两个参数,返回的类型要么是 true 要么是 false。
type Includes= U extends T[number] ? true : falsetype isPillarMen = Includes<["Kars", "Esidisi", "Wamuu", "Santana"], "Esidisi"> // expected to be `false`
Push
实现通用的Array.push类型。
type Push= [...T, U];type Resulted = Push<[1, 2], "3">; // [1, 2, "3"]
Unshift
实现类型 Array.unshift类型。
type Unshift= [U, ...T];type UnshiftList = Unshift<[1, 2], 0>; // [0, 1, 2,]
Parameters
实现内置的 Parameters 类型。
type MyParametersany> = T extends ( ...args: infer U) => any ? U : never;const foo = (arg1: string, arg2: number): void => {};type FunctionParamsType = MyParameters ; // [arg1: string, arg2: number]
edium
ReturnType
不使用 ReturnType 实现 TypeScript 的 ReturnType 泛型。
type MyReturnType= T extends (...args: any[]) => infer R ? R : never;const fn = (v: boolean) => { if (v) return 1; else return 2;};type a = MyReturnType ; // 应推导出 "1 | 2"
Omit
不使用 Omit 实现 TypeScript 的 Omit
type MyOmit= { [key in Exclude ]: T[key];};interface Todo { title: string; description: string; completed: boolean;}type TodoPreview = MyOmit ;const todo: TodoPreview = { completed: false,};
ReadOnly2
实现一个通用MyReadonly2
type MyReadonly2= { readonly [P in K]: T[P];} & { [P in Exclude ]: T[P];};interface Todo { title: string; description: string; completed: boolean;}const todos: MyReadonly2 = { title: "Hey", description: "foobar", completed: false,};todos.title = "Hello"; // Error: cannot reassign a readonly propertytodos.description = "barFoo"; // Error: cannot reassign a readonly propertytodos.completed = true; // OK
DeepReadonly
实现一个通用的DeepReadonly,它将对象的每个参数及其子对象递归地设为只读。
type DeepReadonly= T extends Function ? T : { readonly [K in keyof T]: K extends Object ? DeepReadonly : T[K]; };type X = { x: { a: 1; b: "hi"; }; y: "hey";};type Expected = { readonly x: { readonly a: 1; readonly b: "hi"; }; readonly y: "hey";};type Todo = DeepReadonly ; // should be same as `Expected`
TupleToUnion
实现泛型TupleToUnion,它返回元组所有值的合集。
type TupleToUnion= T[number]type Arr = ["1", "2", "3"]type Test = TupleToUnion // expected to be "1" | "2" | "3"
LastOfArray
实现一个Last,它接受一个数组T并返回其最后一个元素的类型。
type Last= T extends [...unknown[], infer R] ? R : nevertype arr1 = ["a", "b", "c"]type arr2 = [3, 2, 1]type tail1 = Last // expected to be "c"type tail2 = Last // expected to be 1
https://juejin.cn/post/7193917621069152311
如果对您有所帮助,欢迎您点个关注,我会定时更新技术文档,大家一起讨论学习,一起进步。
记录--TS类型写不好?一起来训练提升吧!
判断一个给定数组是否为二叉搜索树后序遍历
防患未然 | AIRIOT城市管廊智能运维解决方案
全球今亮点!xcodebuild命令行工具使用详解
今日热文:欧洲2035禁售燃油车!专家:电动车难完全取代燃油车
环球焦点!Wind11新预览版25300发布:实时字幕对中国用户更加友好!
当前时讯:新日登北京电动自行车不合格“黑榜”:多批电池管理系统有问题
新消息丨不愧是玩无人机的 大疆车载产品矩阵揭秘:高阶辅助只需摄像头
这合理吗?公厕免费取纸先关注微信公众号
快资讯丨pip设置镜像
天天头条:String详解
世界时讯:开心档之Swift 访问控制
计算机导论学习记录(二)
全球微头条丨8个让你收入翻倍的高质量免费网站
重点聚焦!大疆Inspire 3无人机来了:配全画幅X9相机、可录8K视频
全球速递!用了电信5G 浙大完成中国首例5G超远程机器人肝胆手术:跨越近万里
总投资389亿!2023年第一条高铁获批:沿海超级通道定了
全球速讯:消息称腾讯XR团队全线解散:成立不到1年!
鄱阳湖旗舰店麻辣小龙虾官方大促:1.4 斤29.9元到手
深交所向新亚制程发出关注函
全球看点:USRP-2974上安装Ubuntu20.04 + UHD 3.15 + GNU Radio 3.8 过程全记录
VOP 消息仓库演进之路|如何设计一个亿级企业消息平台
【热闻】【管理您的整个软件供应链】上海道宁与Sonatype助力您以更安全的开源更快地交付产品
快看点丨西部数据推出22TB/44TB My Book桌面硬盘 售价高达1500美元
曝光交个朋友欠薪 当事人最新回应:罗永浩正积极联系公司解决
果粉买不?苹果折叠屏会先拿iPad试水!折叠iPhone风险太高了
当前热讯:想要过目不忘?进来学两招、保证不后悔!
世界热资讯!12.4万买帕纳梅拉梦碎 首单车主:保时捷傲慢 100万都不卖
环球视讯!OpenYurt v1.2 亮点速览丨云边流量峰值相比原生 K8s 降低 90%
全球百事通!堆叠柱状图怎么用?速戳!
火山引擎数智平台的这款产品,正在帮助 APP 提升用户活跃度
模型预处理层介绍(3) - IntegerLookup
CC1打不通时的另外一条链CC3
天天通讯!襄阳市消防救援训练与战勤保障大队成立
吴刚谈儿子出演《狂飙》高晓晨:既然选择这条路就要自己走
世界即时:尼泊尔载72人客机失事坠毁 初步调查报告:螺旋桨顺桨失去推力
环球信息:2023年铁路春运圆满收官:累计发送旅客3.48亿人次 增长37.4%
【天天速看料】博主分享特斯拉Model 3P一年使用成本:每公里不到4毛
卖手机壳收入百万:300多元的壳十分畅销
今热点:机器学习-随机森林
【世界独家】docker-compose搭建redis-Cluster集群
环球快资讯丨使用docker部署Python-Flask实现ChatGPT的使用
今日要闻!关于nfs服务启动messages日志中报错-Unable to watch /proc/fs/nfsd/clients: No such file
【世界聚看点】特斯拉不好惹!网红车评人“蔡老板”被判道歉赔10万后:还没饶了他
环球热点评!阿里一面:你做过哪些代码优化?来一个人人可以用的极品案例
天天微头条丨豆瓣仅4分!《三体》动画宣布延播两周:3月4日恢复
全球新消息丨等待16年!好莱坞8.1分末日科幻大片《我是传奇》续集定了:“史皇”出演
【时快讯】罗永浩交个朋友公司被曝欠薪 员工:遭到暴力裁员
天天短讯!二次元真香升级!13代游戏本华硕天选4开启预约
大宇获恐怖电影《咒》IP授权:由《轩辕剑柒》主创张蓁元主导开发
全球观点:02月16日09时广东珠海疫情数据 阳了以后为什么会腰疼?应该怎么办?
树的子结构之先序遍历+二叉树的镜像+对称二叉树
快资讯丨一口气说出 6 种实现延时消息的方案,还有谁不会?!
快看:联发科一夜回到两年前:大家都不换新手机了
弟弟陪姐姐看病:双双确诊甲状腺癌
环球观点:RNG拖欠奖金再上热搜!前俱乐部选手站队喊话还钱
报道:父母高度近视:1岁婴儿近视600度
每日播报!Win10/11后:Linux启动AMD处理器fTPM出现同款间歇性卡顿
tplink路由器怎么重新设置密码?Tplink路由器如何桥接?
mbti哪个脾气最差?哪个mbti最容易抑郁症?
显卡驱动需要更新吗?显卡驱动怎么更新?
项羽墓在哪个地方?项羽墓为什么在山东?
卖惨是什么意思?卖惨的人是什么心理?
保龄球有几个孔?保龄球设备多少钱一套?
长安是唐朝的首都吗?长安是现在的哪个城市?
每日消息!【并查集】连通块中的数量
【热闻】(数据库系统概论|王珊)第三章关系数据库标准语言SQL:习题
Vue 组件之间传递参数
【世界聚看点】关于 layui 弹出一个 DOM 表单的问题
艾斯死的那一集是多少集?艾斯复活是哪一集?
世界最新:马斯克做出重要“交易”:开放北美全部特斯拉超充桩 换取补贴
【全球独家】5月上映!迪士尼《小美人鱼》真人电影新预告发布:特效惊艳
突破事业线
环球观天下!3000元以下唯一的16G内存手机!真我GT Neo5获得天猫京东销量冠军
死磕竞争对手ChatGPT!谷歌要求员工每天花2至4小时测试自家Bard AI
全球球精选!房地产市场支持政策需更精准
安卓导出已安装app的apk
模型预处理层介绍(2) - Hashing
世界信息:男子借朋友12万 1小时后借条变成白纸!网友:防不胜防
顶级富豪果然都惜命 扎克伯格个人安保费一年超1亿元
环球要闻:今起可提前预约个税办税:每天6-22点可在App预约
要闻:接棒年销26万台扫地机器人爆款单品!石头G10S Pure即将正式亮相
天天通讯!吉利中高端新能源系列定名“吉利银河”:每个人都仰望
全球信息:快速搭建一个网关服务,动态路由、鉴权,一网打尽!(含流程图)
全球播报:再有人问你抽象工厂设计模式,把这篇文章丢给他
环球观天下!时间是什么?时间同步是什么?GPS北斗卫星授时又是什么?
世界要闻:《分布式技术原理与算法解析》学习笔记Day13
诺如病毒进入高发期 学校、家庭如何做好预防?一文了解
你怕失业吗?马斯克炮轰人工智能:比核弹头更危险
巴菲特“黄金搭档”芒格盛赞:比亚迪在中国遥遥领先于特斯拉
40岁男子报复10岁小孩连划7车引围观:结局舒适了 网友点赞
《霍格沃茨之遗》更新后PC优化更差!玩家:游戏卡顿问题解决一下
快资讯丨再下一城!百度地图红绿灯倒计时上线兰州:实时读秒
最资讯丨下行5000兆 跟上行同速!谷歌美国推5Gbps光纤:每月850元
全球要闻:读Java实战(第二版)笔记11_语言特性和类库更新
片仔癀珍珠霜的功效
天天热头条丨HEU KMS Activator 28.0.0全能系统数字许可激活工具
CentOS7.9安装K8S高可用集群(三主三从)
Android JetPack~ LiveData (一) 介绍与使用
环球观热点:SDK多项目开发与联调