fncheng / react-learn

0 stars 0 forks source link

TypeScript Omit #6

Open fncheng opened 1 year ago

fncheng commented 1 year ago

Omit

在 TypeScript 中,Omit 是一个专门用于构造新类型的工具类型,可以用来创建一个新类型,它去掉了给定类型中的某个属性。其语法格式如下:

type Omit<T, K extends keyof T> = Pick<T, Exclude<keyof T, K>>

其中 T 表示需要被处理的类型,K 表示需要从 T 类型中去掉的属性名。可以看到,Omit 类型的定义使用了 Pick 工具类型和 Exclude 工具类型。

简单解释一下 PickExclude 工具类型:

所以,Omit 类型的作用就是从类型 T 中排除掉属性名为 K 的属性,得到一个新的类型。例如:

interface Person {
  name: string;
  age: number;
  address: string;
}

type WithoutAddress = Omit<Person, 'address'>;

// 等同于:
// type WithoutAddress = Pick<Person, 'name' | 'age'>

在上面的例子中,WithoutAddress 类型表示去掉 Person 类型中的 address 属性,得到的新类型。实际上,这个新类型就是拥有 Person 类型的 nameage 两个属性的新类型。

使用 Omit 工具类型可以方便地创建一个新类型,而无需重新定义接口或类型别名,提高代码的可读性和可维护性。

extends keyof

extends keyof 是一个组合使用的语法,它表示某个泛型类型参数必须是某个类型中的键名。

fncheng commented 1 year ago

Record

在 TypeScript 中,Record 是一个工具类型,用来创建一个由指定属性类型的对象组成的类型

type Record<K extends keyof any, T> = {
  [P in K]: T;
};

其中,K 表示属性名的类型,T 表示属性值的类型。使用 Record 可以方便地定义一个对象类型,如下所示:

type User = {
  id: number;
  name: string;
};

type UserRecord = Record<number, User>;

const userMap: UserRecord = {
  1: { id: 1, name: 'Alice' },
  2: { id: 2, name: 'Bob' },
  3: { id: 3, name: 'Charlie' },
};

在上面的例子中,我们使用 Record 定义了一个 UserRecord 类型,表示一组以数字为键、以 User 类型的值的对象。然后通过定义一个 userMap 对象,表示一个包含了若干个用户数据的对象。