typescript 类型体操 之 268-easy-if

864 阅读3分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第15天,点击查看活动详情

前言

在学习typescript的过程当中,有一个github库对其类型的学习特别有帮助,是一个有点类似于leetcode的刷题项目,能够在里面刷各种关于typescript类型的题目,本片文章带大家做其中简单难度的第七道题 268-easy-if

type-challenges/type-challenges: Collection of TypeScript type challenges with online judge (github.com)

268-easy-if

我们首先还是先通过题目的README来看一下题目的要求

image.png

import type { Equal, Expect } from "@type-challenges/utils";

type cases = [
  Expect<Equal<If<true, "a", "b">, "a">>,
  Expect<Equal<If<false, "a", 2>, 2>>
];

// @ts-expect-error
type error = If<null, "a", "b">;

结合题目给的README和测试case,我们就能够得出,题目是需要我们实现一个函数,能够根据第一个参数来判断返回第二个参数或者第三个参数。

利用js进行对比学习

首先我们还是先用js来模拟题目的要求。

我们用数组来进行模拟,新建一个 JSIf 函数,这个函数传入三个参数,第一个参数是一个布尔值,用于判断返回T或者F。

// js
function JSIf(C,T,F){
    return C?T:F
}

image.png

实现 If

接着我们就按照js的逻辑来实现ts的代码

今天这题如果有搞懂昨天的条件运算,应该是很简单的一道题目,甚至于比昨天的还简单,题目传入的参数已经给出了判断的条件,以及每一种情况需要返回的值,我们可以用 C 是否 约束与 ture 来判断 C 是 true 还是 false

type If<C, T, F> = C extends true? T: F;

然后根据上面的逻辑,满足的话返回 T,不满足返回 F。

但是我们看到测试case:

image.png

这个报错我们在之前的题目中已经有去提到过了,如果忘记了的小伙伴可以回顾一下之前的文章,或者在下面的知识点中也会放上官方文档的位置。

  • 提到过这个注释的题目文章:

typescript 类型体操 之 11-easy-tuple-to-object - 掘金 (juejin.cn)

报错的这一句注释的意思是,期望底下的这段代码抛出错误,否则这句注释就会报错

那么我们来看一下下面的这段代码:

// @ts-expect-error
type error = If<null, "a", "b">;

对于题目的要求当中,后面两个参数可以传入任何值,那么就不可能会报错,只存在第一个参数报错的情况,这时候就可以发现,我们没有约束第一个参数的传入值,当它传入null的时候,被判定为 false 还是能够继续正常运行。

image.png

所以我们要给第一个参数加上约束,只能够一个布尔值:

type If<C extends boolean, T, F> = C extends true? T: F;

这样之后,我们的测试 case 就能够全部通过了,这样我们也就完成这道题目了。

知识点

关于上述提到了部分的知识点:

  1. 条件类型
  2. @ts-expect-error 注释

今天的知识点都是之前已经介绍过的了,关于条件类型可以看一下昨天的 typescript 类型体操 之 43-easy-exclude - 掘金 (juejin.cn)

关于 @ts-expect-error 注释,这里还是放上官方文档的指路。

TypeScript: Documentation - TypeScript 3.9 (typescriptlang.org)

总结

今天这道题的知识点都比较简单,实现起来的难度应该不大,不了解部分知识的可以回顾一下之前做过的题目。