# typescript 类型挑战

关于 github 上type-challenges (opens new window)上 ts 学习代码

刷题记录

序号 题目 难度 问题 完成时间
4 Pick 简单 2022.02.24
7 ReadOnly 简单 2022.02.24
11 元组转对象 简单 2022.02.24
10 元组转合集 中等 2022.02.28
12 可串联构造器 中等 2022.02.28
15 最后的元素 中等 2022.02.28
10 Pop 中等 2022.03.01
10 Promise.all 中等 2022.03.02

# 一、Simple

# 1. Pick

题目:

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

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

例如:

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

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

const todo: TodoPreview = {
  title: "Clean room",
  completed: false,
};
1
2
3
4
5
6
7
8
9
10
11
12

代码:

/**
 * extends 继承
 * keyof 获取类型所有key
 * in 指定属性在指定对象中
 */
type MyPick<T, K extends keyof T> = { [P in K]: T[P] };
1
2
3
4
5
6

# 2. ReadOnly

题目

不要使用内置的Readonly<T>,自己实现一个。

Readonly 会接收一个 泛型参数,并返回一个完全一样的类型,只是所有属性都会被 readonly 所修饰。

也就是不可以再对该对象的属性赋值。

例如:

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

const todo: MyReadonly<Todo> = {
  title: "Hey",
  description: "foobar",
};

todo.title = "Hello"; // Error: cannot reassign a readonly property
todo.description = "barFoo"; // Error: cannot reassign a readonly property
1
2
3
4
5
6
7
8
9
10
11
12

代码:

/**
 * readonly 只读
 */
type MyReadonly<T> = { readonly [k in keyof T]: T[k] };
1
2
3
4

# 3. 元组转对象

题目

传入一个元组类型,将这个元组类型转换为对象类型,这个对象类型的键/值都是从元组中遍历出来。

例如:

const tuple = ["tesla", "model 3", "model X", "model Y"] as const;

type result = TupleToObject<typeof tuple>; // expected { tesla: 'tesla', 'model 3': 'model 3', 'model X': 'model X', 'model Y': 'model Y'}
1
2
3

代码:

type TupleToObject<T extends readonly string[]> = { [k in T[number]]: k };
1
Last Updated: 3/3/2022, 11:25:11 PM