首先是泛型,泛型理解为传递给函数的一种“类型”参数

interface Map<T,P> = (T) => P

然后是extends关键字,他不是面向对象编程中的继承extends关键字,而是一种后者是否是前者的“超集”的含义

interface Animal {
	name:string
}
 
interface Dog extends Animal {
	color:string
}

这里的Dog是Animal的超集,Animal中的所有属性Dog都有,除了Animal的属性,还添加了color属性,除了这些,还可以作为表达式使用

type feature ={
	color:string	
}
 
interface Animal<T> = T extends feature ? Dog : never

如果传递过来的T是feature的超集,那么就会推断Animal为Dog类型,否则是never类型

结合infer关键字,可以结合出强大的类型操作,infer顾名思义就是推断,推断是不是这个类型

interface A<T> = T extends Array<infer B> ? B : never

这里的代码就是推断传递过来的T是否是元素包含B的数组,如果是,那么A的类型为B,否则为never

还有 in keyof [as ..] 关键字,in keyof用于遍历一个类型的所有属性的键,后面的as 部分是给这个键来起别名的

keyof 是用来遍历后面类型所有属性的键名,把它变为一个联合类型

in 就是用来将后面的联合类型迭代,将联合类型的每一个变为当前的一个属性

interface A<T> {
	[P in keyof T]
}

key of T遍历 T 的键名为联合类型,再由in 来迭代为 P

A这个类型会遍历传递过来的T的所有属性键,并添加到自己的属性当中,并且还可以用as来为这些属性键依次起别名

function isPromise<T = any>(val: any): val is Promise<T> {
  return (
    val !== null &&
    (typeof val === 'object' || typeof val === 'function') &&
    typeof val.then === 'function'
  )
}

这里的 is 为类型谓词, 它的作用是:告诉 TypeScript 编译器,如果这个函数返回 true,那么在调用该函数的代码块内,val 的类型就确定是 Promise<T>

下面的示例是 typeof 以及 keyof 的配合组合,可以仅编辑一个对象,就能进行类型推断枚举,相较于枚举 emun 关键字,他还可以作为值使用(对象本身),还可以类型推断,是比较推崇的做法,这里是在 orval 学习到的

export type OriginpointengineInternalApiHandlersResCode = typeof OriginpointengineInternalApiHandlersResCode[keyof typeof OriginpointengineInternalApiHandlersResCode];
 
// eslint-disable-next-line @typescript-eslint/no-redeclare
export const OriginpointengineInternalApiHandlersResCode = {
  CodeSuccess: 1000,
  CodeInvalidParam: 1001,
  CodeNeedLogin: 1100,
  CodeInvalidToken: 1101,
  CodeTokenExpired: 1102,
  CodeUserNotFound: 1200,
  CodeUsernameTaken: 1201,
  CodeEmailTaken: 1202,
  CodeAccountNotActive: 1203,
  CodeInvalidCredentials: 1204,
  CodeVerificationFailed: 1205,
  /** 手机号已被使用 */
  CodePhoneTaken: 1206,
  /** 手机号未注册 */
  CodePhoneNotRegistered: 1207,
  /** 手机号已绑定 */
  CodePhoneBound: 1208,
} as const;

reference

https://www.youtube.com/watch?v=bnTAOB3P6nM&t=807s https://www.youtube.com/watch?v=EcCTIExsqmI