[Day21] Conditional Chains

虽然昨天说 TypeScript 已经差不多,但其实还有一个(或一些?)还没写到。我们来看一段程序码:

conditional chain

上面这个是在 React 中的一段型别定义,今天没有要细部看里面的每个部分,而是着重在 Day08 时提到的 Conditional Type 的部分,通常当有多个条件判断 if...else if ... else if ... else 的时候,为了避免难以阅读,我们不会用三元运算子这样的写法,可能会改用 switch 等其他写法,然而在 TypeScript 中,要表达条件式没有其他的方法,还是只能透过三元运算子,所以你有时会看到上面这种排列,这种串连 ? : 的写法称作 Conditional Chains。

Conditional Chains

实际上 Conditional Chains 并不是 TypeScript 特有的东西,只是一般有其他选择的情况下(例如,JavaScript)我们不会这样写。虽然第一眼看到时头很痛,但其实如果 Conditional Chain 有适当排列的话,并没有想像的这麽难懂。

在 MDN 中提供了 Conditional Chains 很好的范例:

// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Conditional_Operator#conditional_chains

function example(…) {
    return condition1 ? value1
         : condition2 ? value2
         : condition3 ? value3
         : value4;
}

// Equivalent to:

function example(…) {
    if (condition1) { return value1; }
    else if (condition2) { return value2; }
    else if (condition3) { return value3; }
    else { return value4; }
}

对应着刚刚看到的那段原始码,就可以发现:

Conditional Chains

它其实是由三个条件判断是所组成。也就是:

if C extends { propTypes, defaultProps } ... Defaultize ... 
else if C extends { propTypes } ... MergePropTypes ...
else if C extends { defaultProps } ... Defaultize
else P

这里在做的事情,其实就是判断这个泛型 C 是同时带有 propTypesdefaultProps,或只有带有其中之一的情况,分别要回传不同的型别。这里你也可以看到笔者曾在 Day10 提到的,在使用 Conditional Types 时,还可以使用 infer 来取出对应的型别使用。

虽然我们单从这里可能还没有办法完全理解这段 Utility Types 做了什麽,但至少我们大概可以了解在不同的条件下,它会在呼叫不同的 Utility Types 来回传不同的型别。

Nested Conditional Chains

如果是像上面那种单纯的 Conditional Chains 还算好理解,但有些时候还会有 nested 的 conditional chains,这时候缩排就又显得更重要了,例如:

function example(…) {
    if (condition1) { 
      if (condition1_1) {
	      return value1;        
      } else {
        return value1_1;
      }
    } else if (condition2) {
      return value2;
    } else { 
      return value4;
    }
}

写成三元运算子就会像这样:

function example() {
  return condition1
    ? condition1_1
      ? 'value1' 
      : 'value1_1'
    : condition2
    ? 'value2' 
    : 'value4';
}

我知道有点吓人,第一眼看到有点吓人,但在 TypeScript 中因为没有 ifswitch 这种关键字,所以最好的方式就是透过良好的缩排来帮助阅读。

但真的还是很不好阅读就是...

Conditional Chains

参考资料


<<:  下个赌场更诱人

>>:  【Day 27】差点被我遗忘的 x AWS RDS on Outpost x 云端资料库储存

[Android Studio菜鸟的学习分享]完赛结语

三十天说常不常说短不短, 今天是最後一天了, 回顾这三十天真的觉得不可思议我居然能坚持到现在, 这次...

怎么恢复安卓系统被删除的短信呢?

您可能会因为错误的点击而意外删除重要的短信,或者在恢复出厂设置、系统崩溃、Android 更新、ro...

C# 入门笔记03(封装)

变数 C# 中提供的基本值型别可以分为: 定义变数 C# 中变数定义的语法是:data_type 因...

Day 2: Nativescript底层架构

先偷一张Nativescript v6官网的图放着,内容晚点补 来源: https://v6.doc...

html 汇入图片

今天来说如何汇入图片,我想要在标题栏的左侧加一个logo,避免版权问题我自己画了一个Logo的示意图...