ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

ts学习笔记十一:条件类型

2021-11-04 21:29:59  阅读:223  来源: 互联网

标签:十一 string ts 笔记 infer extends 类型 type any


// ts中的条件类型  满足某个条件给一个类型, 不满足给另一个类型
interface Fish {
    name: string,
    type: '鱼'
}
interface Bird {
    name: string,
    type: '鸟'
}
interface Swiming {
    swiming: string
}
interface Sky {
    sky: string
}

//               T  extends  Fish ? Swining  : Sky
type MyType<T> = T extends Bird ? Sky : Swiming; // 三元表达式, 如果你传入的是一个联合类型,他会进行条件的分发  Fish extends Bird |  Bird  extends Bird
type IEnv = MyType<Fish | Bird>; // 这个类型不具备分发的功能 可以实现出返回联合类型

// 如果用户传递了name属性 就必须传递age
// 其他情况下 用户可以只传递age

// interface ISchool1 {
//     name: string,
//     age: number
// }
// interface ISchool2 {
//     age?: number,
//     size: string
// }

// type School<T> = T extends { name: string } ? ISchool1 : ISchool2
// type MySchool = School<ISchool2>


// Exclude:ts中内置的类型 内置类型包含条件的情况 (内部用条件来实现的)

type Exclude<T, K> = T extends K ? never : T; // 在多个类型中提排除掉某几个
type MyExclude = Exclude<string | number | boolean, boolean>

// Extract:多个属性中 抽离某几个
// type Extract<T, K> = T extends K ? T : never;
type MyExtract = Extract<string | number | boolean, boolean>

// NonNullable:在多个类型中排除null类型
type NonNullable<T> = T extends null | undefined ? never : T; // 在多个类型中提排除掉某几个
type MyNonNullable = NonNullable<string | number | null | undefined>


// ------------------infer 推断-------------------
// 获取函数的返回值类型  ,infer放在哪里 就是推断哪里的结果
function getSchool(x: string, y: number) {
    return { name: 'zf', age: 12 }
}
// infer 要配合extends 关键字 否则无法使用  infer有推断类型的功能 可以自动推断出结果

// type ReturnType<T extends ((...args: any[]) => any)> = T extends ((...args: any[]) => infer R) ? R : any
type MyReturnType = ReturnType<typeof getSchool>;

// type Parameters<T extends ((...args: any[]) => any)> = T extends (...args: infer P) => any ? P : any
type MyParameters = Parameters<typeof getSchool>;

class Person {
    constructor(name:string){}
}
// type ConstructorParameters<T extends new (...args:any[])=> any> = T extends new (...args:infer CP)=> any ? CP:any
type MyConstructorParameters = ConstructorParameters<typeof Person>

type InstanceType<T extends new (...args:any[])=> any> = T extends new (...args:any[])=> infer R ? R:any
type MyInstanceType = InstanceType<typeof Person>;



// T extends xxx?  三元 、 类型分发、infer关键字
export { }

标签:十一,string,ts,笔记,infer,extends,类型,type,any
来源: https://blog.csdn.net/weixin_43837268/article/details/121151444

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有