TypeScript 类型挑战:实现 Pick

开发 前端
本文主要解答来自 Type Challenges 中的 TS 类型挑战问题,以此更好的了解 TS 的类型系统,编写自己的类型工具。

高质量的类型可以提高项目的可维护性并避免一些潜在的漏洞。

一些大厂在前端面试中也考察到了 TypeScript 高级类型的定义,本系列主要解答来自 Type Challenges 中的 TS 类型挑战问题,以此更好的了解 TS 的类型系统,编写自己的类型工具。

下面来看一个难度为简单的题目:实现 Pick

题目描述

实现 TS 内置的 Pick,但不可以使用它。

从类型 T 中选择出属性 K,构造成一个新的类型。

例如:

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

type TodoPreview = MyPick<Todo, 'title' | 'completed'>

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

题目解答

Pick 类型用于从T类型中选择部分属性K来构造新的类型。

首先,我们需要遍历对象 T。那就要使用映射类型来遍历:

type MappedType<T> = {
[Key in keyof T]: T[Key];
};
  • keyof T用于从对象类型T中获取键值 key;
  • in用于对对象键值key进行迭代;
  • Key 就是对象键值 key 本身;
  • T[Key]是指定 Key 的值;

然后,要想迭代获取对象的某个部分,就需要指定要迭代的key:

type MappedType<T, Keys> = {
[Key in Keys]: T[Key];
};

但是,这样写就会有两个错误:

  • 不能将类型“Keys”分配给类型“string | number | symbol”。
  • 类型“Key”无法用于索引类型“T”。

这两个错误都与迭代规则有关:

  • key 可以是string、number、symbol;
  • 如果T中不存在Key,就不能调用T[Key]。

如果规则 2 成立,那么规则 1 一定是成立的,因为现有的 keys 是指定类型之一。为了迭代现有的 key,我们需要使用extends关键字进行约束。这样,如果指定不存在的 key,TypeScript 将抛出一个错误,如果T中不存在这个 key,就不能调用T[key]。

Pick的实现如下:

type MyPick<T, Keys extends keyof T> = {
[Key in Keys]: T[Key];
};

Type Challenges:https://github.com/type-challenges/type-challenges

责任编辑:武晓燕 来源: 前端充电宝
相关推荐

2024-03-04 06:40:49

工具类型TypeScripDeepPick

2022-05-19 09:01:08

TypeScript元组对象

2022-04-11 08:42:09

TypeScript子类型定义

2022-09-14 15:24:57

typescript快排

2021-06-09 07:55:19

Typescript类型检查

2022-02-09 08:11:50

架构

2021-06-05 21:30:24

typescriptOverride检查

2022-09-20 14:43:55

TypeScript类型体操

2022-02-25 09:06:02

TypeScripnever工具

2021-07-27 06:06:34

TypeScript语言运算符

2021-08-18 07:56:05

Typescript类型本质

2021-05-16 18:02:52

系统编程JavaScript

2022-08-08 09:00:42

TypeScript映射类型

2021-12-10 08:21:15

TypeScript高级类型类型体操

2022-06-19 22:54:08

TypeScript泛型工具

2020-12-29 07:15:34

TypeScript语言代码

2020-09-15 08:35:57

TypeScript JavaScript类型

2022-08-10 09:03:35

TypeScript前端

2019-03-21 09:45:11

TypeScript编程语言Javascript

2022-03-09 20:18:49

TypeScript类型函数
点赞
收藏

51CTO技术栈公众号