ts学习总结5

125 阅读3分钟

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>

代码格式化配置

image.png

安装好prettier 后

image.png

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 anystring number symbol
keyof unknownnever

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]

}