开启辅助访问     
收藏本站

站内搜索

搜索

Minecraft(我的世界)苦力怕论坛

[开发教程] typescript,有关工具类型

 发表于 2024-6-5 23:50:23 来自手机|显示全部楼层|阅读模式 IP:安徽省
本帖最后由 夙S溯 于 2024-6-6 00:18 编辑

手机不好看图片,所以下面会有一个图片错位,还有两个误上传的图片在低部,注意甄别
简单的说说
本人没有系统的学过typescript,只是在网上散学而已,如有错误,请指出



最基础的变量类型定义太简单,不讲
基础的泛型太简单,不讲
in, keyof 默认你们会
在typescript里,我们有时候会遇到把一个类型变成另一个类型的函数,比如参数是string,返回number,参数number,返回string,这个时候我们应该如何声明类型呢
先想思路,如果我们要把一个类型换成另一个类型,那么我们应该是,判断这个参数的类型,如果是,那就返回一个,否则返回另一个
如何判断参数的类型是不是同一个类型呢?
我们往往可以这样写
IMG20240605224128.jpg
他定义了两个泛型并判断是否相等,一般来说是可以这么比,但是遇到object就不一样了
接下来是两种更严格的比较
Image_1717599049170.jpg
这种是完全相等,例子
元组,内部储存相同字符串,但是会因为顺序不同而被判false,但是对于联合类型会被判断为boolean,这是因为联合类型的特殊性,只有联合类型内部类型完全不同或者完全相同时才会返回true或者false,其余都是true和false的联合类型boolean
Image_1717599222310.jpg

Image_1717599744591.jpg
还可以用于检测两个对象的key-value是否相等
Image_1717602395306.jpg
Image_1717600033394.jpg
可以发现哪怕只有某个属性的函数返回值不同,也依然会返回false
接下来是一种不太严格的类型毕竟,即只比较结构,可以区分不同对象且不会因为object类型出现意料之外的情况
Image_1717600222330.jpg
效果
Image_1717600391411.jpg
Image_1717600358115.jpg
可见他是不会去比较值的,只会去比较key
那么有了这些,我们就可以声明一个类型相互转化的函数了,如下图
Image_1717601426121.jpg
Image_1717601427944.jpg
他可以根据第一个泛型类型来选择另一个与之不同的类型,当然更严格点你可以创建个元组并判断要检测的类型是否在元组里
当然,连个可能不太够是吧,我的函数比较万能,能处理N个类型
声明这样的函数可以用映射类型,我的思路是填入两个元组将其一一对应起来,最终根据函数参数来确定具体转化的值,如
Image_1717601993860.jpg
如图所示,FindIndexes用于查找一个类型在元组中的索引
Mapping根据两个元组和一个泛型类型以确定这个泛型类型最终要转化成的类型
例子
Image_1717602393721.jpg
Image_1717602395306.jpg
Image_1717602396825.jpg
Image_1717602398234.jpg
Image_1717602399566.jpg
Image_1717602400956.jpg
可以看到其对于never出现了bug,不过应该没有人会需要输入一个never吧(意料之外的情况,void类型都是正常的)
今天先说到这里
源码,欢迎复制

export type IsIdenticalType<Type,$Type> = keyof Type extends keyof $Type ? keyof $Type extends keyof Type ? true : false : false
type FindIndexes<Arrs,Type> = {
[Key in keyof Arrs]:true extends strictEquality<Arrs[Key],Type> ? Key : never
}[number]
export type Mapping<Types1,Types2,Target> = {
[K in keyof Types1]:Types2[FindIndexes<Types1,Target>]
}[0]
type strictEquality<Type,Target> = Type extends Target ? Target extends Type ? true : false : false
type User = {
name:string
password:string
id:number
setPassword:(newPassword:string)=>'修改成功'
}
type UserUser = {
name:any
password:null
id:never
setPassword:undefined
}
type ChangeType<SourceType,One,Else> = true extends strictEquality<SourceType,One> ? Else : One
function display<Type>(type:Type){}
display<Mapping<
[User,object,UserUser,number,void],
[number,string,UserUser,object,{password:string}],
void
>>()
Screenshot_2024-06-05-23-06-57-74_f9a7afa717ced9e1fc9be9833291031a.jpg
Screenshot_2024-06-05-23-12-56-68_f9a7afa717ced9e1fc9be9833291031a.jpg
苦力怕论坛,感谢有您~
 发表于 2024-6-6 20:28:18|显示全部楼层 IP:四川省
感谢分享(∗❛ั∀❛ั∗)✧*。
2#2024-6-6 20:28:18回复收起回复
苦力怕论坛,感谢有您~
回复支持

使用道具举报

 楼主|  发表于 2024-6-6 20:31:34 来自手机|显示全部楼层 IP:安徽省
感觉写的跟史一样
3#2024-6-6 20:31:34回复收起回复
苦力怕论坛,感谢有您~
回复支持

使用道具举报

本版积分规则

本站
关于我们
联系我们
坛史纲要
官方
哔哩哔哩
技术博客
下载
网易版
安卓版
JAVA
反馈
意见建议
教程中心
更多
捐助本站
QQ群
QQ群

QQ群

访问手机版

访问手机版

手机版|小黑屋|系统状态|klpbbs.com

粤公网安备 44200002445329号 | 由 木韩网络 提供支持 | GMT+8, 2024-11-24 14:55

声明:本站与Mojang以及微软公司没有从属关系

Powered by Discuz! X3.4 粤ICP备2023071842号-3