TS进阶之keyof

103 阅读1分钟

TS演练场地址

我的演练场地址

keyof使用集合

blog.csdn.net/lcl130/arti…

// 基本用法
type Person = {
  id: number;
  name: string;
  age: number;
}

type P1 = keyof Person; // //'id' | 'name' | 'age'

// 实际应用
// 获取对象所有属性的类型
type P2 = Person[keyof Person]; // // number | string

// 约束范型参数的范围
// type MyPick<T, K extends keyof T> = { [P in K]: T[P] };
type MyPick<T, K extends keyof T> = { [P in K]: T[P] };
type P3 = MyPick<Person, 'id' | 'age'>;
const person: P3 = {
  id: 0,
  age: 12
}
person.age = 13;
console.log('person', person)

// 和映射类型组合实现某些功能
type MyReadonly<T> = { readonly [P in keyof T]: T[P]};
type P4 = MyReadonly<Person>; // { readonly id: number; readonly name: string; readonly age: number; }
const person1: P4 = {
  id: 0,
  name: 'readonly',
  age: 12
}

person1.name = '张三'; // name为只读类型不能修改

// 去掉对象类型的某些属性
type MyOmit<T, K> = { [P in keyof T as P extends K ? never : P]: T[P] };
type P5 = MyOmit<Person, 'id' | 'name'>; // {age: number;}

// 给对象类型添加新的属性
type AppendToObject<T, U extends keyof any, V> = {
  [P in keyof T | U]: P extends keyof T ? T[P] : V
}
type P6 = AppendToObject<Person, 'address', string>; // { address: string; id: number; name: string; age: number; }

// 和条件类型组合实现功能
type Merge<F extends Record<string, any>, S extends Record<string, any>> = {
  [P in keyof F | keyof S]: P extends keyof S ? S[P] : P extends keyof F ? F[P] : never;
}
type Skill = {
  run: () => void;
}
type P7 = Merge<Person, Skill>; // { id: number; name: string; age: number; run: () => void; }

// 子对象的属性变为可选项
type enableReactions<T> = {
  [K in keyof T]: T[K] extends Record<string, any> ? Partial<T[K]> : T[K]
}

// 映射类型语法
type MyProps<T> = {
  [K in keyof T]: T[K]
}
type P8 = MyProps<Person>; // { id: number; name: string; age: number; }