UID1396355性别保密经验 EP铁粒 粒回帖0主题精华在线时间 小时注册时间2023-9-29最后登录1970-1-1
| 本帖最后由 夙S溯 于 2024-6-6 00:18 编辑
手机不好看图片,所以下面会有一个图片错位,还有两个误上传的图片在低部,注意甄别
简单的说说
本人没有系统的学过typescript,只是在网上散学而已,如有错误,请指出
最基础的变量类型定义太简单,不讲
基础的泛型太简单,不讲
in, keyof 默认你们会
在typescript里,我们有时候会遇到把一个类型变成另一个类型的函数,比如参数是string,返回number,参数number,返回string,这个时候我们应该如何声明类型呢
先想思路,如果我们要把一个类型换成另一个类型,那么我们应该是,判断这个参数的类型,如果是,那就返回一个,否则返回另一个
如何判断参数的类型是不是同一个类型呢?
我们往往可以这样写
他定义了两个泛型并判断是否相等,一般来说是可以这么比,但是遇到object就不一样了
接下来是两种更严格的比较
这种是完全相等,例子
元组,内部储存相同字符串,但是会因为顺序不同而被判false,但是对于联合类型会被判断为boolean,这是因为联合类型的特殊性,只有联合类型内部类型完全不同或者完全相同时才会返回true或者false,其余都是true和false的联合类型boolean
如
还可以用于检测两个对象的key-value是否相等
可以发现哪怕只有某个属性的函数返回值不同,也依然会返回false
接下来是一种不太严格的类型毕竟,即只比较结构,可以区分不同对象且不会因为object类型出现意料之外的情况
效果
可见他是不会去比较值的,只会去比较key
那么有了这些,我们就可以声明一个类型相互转化的函数了,如下图
他可以根据第一个泛型类型来选择另一个与之不同的类型,当然更严格点你可以创建个元组并判断要检测的类型是否在元组里
当然,连个可能不太够是吧,我的函数比较万能,能处理N个类型
声明这样的函数可以用映射类型,我的思路是填入两个元组将其一一对应起来,最终根据函数参数来确定具体转化的值,如
如图所示,FindIndexes用于查找一个类型在元组中的索引
Mapping根据两个元组和一个泛型类型以确定这个泛型类型最终要转化成的类型
例子
可以看到其对于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
>>() |
|