Ts类型工具

llz小于 1 分钟

把类型某些属性变成可选的

  • 步骤
  1. 使用 Omit 把要变成可选的属性剔除,构造一个新的类型;
  2. 使用 Pick 把要变成可选的属性挑选出来,构造从一个新的类型;
  3. 使用 Partial 把第2步中构造出来的新类型变成可选了;
  4. 对第1步和第4步生成的类型进行交叉运算(&);
interface IUserInfo{
  name:string,
  age:number,
  gender:string
}

/**
 * 1.Omit(IUserInfo,'age')
 * 构造出来的新类型只能传入 name和 gender 属性
 * Initial type: {name: string, gender: string}
 */

type SomePartial1=Omit<IUserInfo, 'age'>

/**
 * 2.Pick(IUserInfo,'age')
 * 构造出来的新类型只能传入 age 属性
 * Initial type: {age: number}
 */

type SomePartial2=Pick<IUserInfo, 'age'>

/**
 * 3.Partial(SomePartial2,'age')
 * 把 2中 的类型所有的属性变成可选的
 * Initial type: {age?: number}
 */

type SomePartial3=Partial<SomePartial2>

/**
 * 4. 对1和3使用交叉运算
 */
type SomePartial=SomePartial3 & SomePartial1

//ok
const user:SomePartial={
  name:'rice',
  gender:'man',
}

最后可以使用泛型对 SomePartial<T,K> 进行完善:T 类型接口,K:要变成可选的属性

// 工具代码
type SomePartial<T, K extends keyof T> = Omit<T, K> & Partial<Pick<T, K>>

// 效果
const user: SomePartial<IUserInfo, 'age'|'name'> = {
  gender: 'man',
}