ts条件类型
type StatusCode<T>=T extends 200|201|304|204?'success':'fail'
type IReurnMessage=StatusCode<200>
类型赋予 1根据结构角度 分析 2根据类型角度分析
type IObj<T>=T extends {name:'cxk'}?'1':'0'
type IPeron= IObj<{name:'cxk',age:20}> //1
type Iperson=IObj<{}>//0
nver是任何类型的子类型
字面量类型
基础类型
any unknown (不知道类型最大的类型)
-
never 能extends ' str'
-
never能extends string
-
string 能extends String
-
'str' 能extends string
-
String 能extends object
-
String 能extends {}
-
string不能 extends object
{} 和objcet可以看成字面量类型(可以看出结构 跟 类型两部分)
- {} 能 extends object
- object 也能extens {}
- object 能Extends Object √
- Object能extends objcect √
- Object能extends {} √
- {} 能extends object √
这些√的例子是从结构上的来看的
string 不能extends object 是因为string跟object从基本类型上来分了
小{} 看成结构类型 objct看成基本类型, 大Object 看出原型链对象
string 能extends any string 能extends unknown
any 与unknown 互相extends
// cxk=boolean 原因是条件类型有分发机智 先比较是不是属于1 然后其他不属于1 的部分进行比较 得到了true|false ,因为难办所以就不办了 得出cxk=boolean
type cxk =any extends 0 ?true :false
type cxk=never extens 1?true :false正常 cxk是 true的
当改成通过泛型传入类型的时候
type TK<T>=T extends 1 ?true:false;
type Temp=Tk<never>// Temp 的类型就是never
这里的出any通过泛型传入会触发分发机智,never通过泛型传入指挥返回never
interface Fish{
name:'坤'
}
interface Bird{
name:'鸡'
}
interface Water{
name:'海'
}
interface Sky{
name:'天'
}
type GetType<T extends Fish|Bird>=T extends Fish?Water:Sky;
type A1=GetType<Fish|Bird>
A1=Water|Sky
这里出现了分发类型导致的问题 1.联合类型通过泛型传递 2.而且比较的(extends)时候产生分歧 3.类型需要裸类型(裸类型就是泛型就自己没有跟别的东西搭配)
type GetType<T extends Fish|Bird>=[T] extends [Fish]?Water:Sky;
用[]包裹一下变成元组不是裸类型了
type A1 就变成了sky了
想要取消裸类型的分发问题 可以这么改代码 把泛型交一个空对象 空对象没啥叼用就是更明确的意思
type GetType<T extends Fish|Bird>=T &{} extends Fish?Water:Sky;
再举个例子
type UnionAssets<T,K>=T extends K ? true:false
type U1=UnionAssets<1|2,1|2|3>
type U2=UnionAssets<1|2|3,1|2> 所以这里U2是boolean
U2 就是 1 extends 1|2 true
U2 就是 2 extends 1|2 true
U2 就是 3 extends 1|2 false
分发场景需要的可以利用分发场景 不需要的可以不分发
type NoDistibute<T>=T&{}
type UnionAssets<T,K>= NoDistibute<T> extends K ? true:false
判断值是否一致
type isEqual<T,K,S,F>= NoDistibute<T> extens K ? NoDistibute<K> extends T?S:F:F;
type A2=isEqual<1|2,2|1,true,false>
代码格式化配置
安装好prettier 后
ts如果自动类型推断正确可以不用改,如果类型推导不正确那就开发者手动修改推导
改造前
function sum<T extends string | number>(a: T, b: T): T {
return a + (b as any);
}
let r = sum(1, 2);
let r='abc123'//这里会把上面自动推导的类型赋值给变量r 国语死板导致报错
期望通过返回值来重新让推倒的类型的得到严禁
改造后
type FormatVal<T> = T extends string
? string
: T extends number
? number
: never;
// 映射关系 可以考虑用泛型,参数个数不一致,类型和入参数无法,要考虑重载
function sum<T extends string | number>(a: T, b: T): FormatVal<T> {
return a + (b as any);
}
let r = sum(1, 2);
条件类型
keyof any 出string number symbol
keyof unknown 出never
intreface cxk{
rap:string
}
intreface cxk2{
drag:string
}
type Compute<T extends object>={
[key in keyof T]:T[key]
}
type Cxk=Compute<cxk&cxk2>
interface Iperson{
name:string,
age:number
}
interface ICompany{
name:string
age:number
address:string
person:Iperson
}
type Partial<T>={//可选
[key in keyof T]?:T[key];
}
深度递归可选
type DeepPartial<T>={
[key in keyof T]?:T[key] extends object?DeepPartial<T[key]:T[key
}
同理的出必填
type Required<T>={
[key in keyof T]-?:T[key]
}