4、重学TS-第四题

160 阅读1分钟

Pick<T, K extends keyof T> 的作用是将某个类型中的子属性挑出来,变成包含这个类型部分属性的子类型。

interface Todo {
  title: string;
  description: string;
  completed: boolean;
}

type TodoPreview = Pick<Todo, "title" | "completed">;

const todo: TodoPreview = {
  title: "Clean room",
  completed: false
};

那么如何定义一个 ConditionalPick 工具类型,支持根据指定的 Condition 条件来生成新的类型,对应的使用示例如下:

interface Example {
	a: string;
	b: string | number;
	c: () => void;
	d: {};
}

// 测试用例:
type StringKeysOnly = ConditionalPick<Example, string>;
//=> {a: string}

解法1:

type ConditionalPick<T, U> = {
  [K in keyof T as [T[K]] extends [U] ? [U] extends [T[K]] ? K : never : never] : T[K];
}
[A] extends [B] ? [B] extends [A] ? true : false : false // 判断2个对象是否完全一致