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

// 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 { }

好的,让我来回答你关于 TypeScript 中 Symbol 和模块的问题。 首先,Symbol 是 TypeScript 中的一种新的基本数据类型,它可以用来创建唯一的标识符。在 TypeScript 中,Symbol 主要有两种用法: 1. 作为对象属性的键值,用来表示一个对象属性的唯一标识符。 2. 作为一个类的静态属性或方法,用来表示该类的唯一标识符。 下面是一个使用 Symbol 作为对象属性键值的示例: ```typescript const key = Symbol('myKey'); const obj = { [key]: 'value' }; console.log(obj[key]); // 输出'value' ``` 在上面的代码中,我们使用 Symbol('myKey') 创建了一个新的 Symbol,然后将该 Symbol 作为对象 obj 的属性键值,并赋值为'value'。最后,我们通过 obj[key] 的方式来访问该属性,并输出了'value'。 另外,模块是 TypeScript 中的另一个重要概念,它用来组织和管理代码。在 TypeScript 中,模块可以使用 import 和 export 命令来进行导入和导出。下面是一个使用模块的示例: ```typescript // moduleA.ts export const num = 123; // moduleB.ts import { num } from './moduleA'; console.log(num); // 输出123 ``` 在上面的代码中,我们定义了一个名为 num 的常量,并将其导出。然后,在另一个模块中,我们使用 import 命令将 num 导入,并通过 console.log 输出了它的值。 这就是关于 TypeScript 中 Symbol 和模块的简单介绍,希望能对你有所帮助。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值