Typescript支持泛型,也叫类型参数,对类型参数进行一系列操作后可以返回一个新的类型,这就是类型编程。因为类型编程还很难实现一些逻辑,所以被戏称为类型体操。社区使用Typescript类型实现Lisp解释器,实现象棋等案例(知乎上可以找到),足以说明Typescript类型可以实现各种复杂的逻辑。打字体操这么难,有什么方法可以快速掌握吗?确实,我总结了一些套路,可以快速提高ts式体操的水平。比如我们今天要讲的套路——模式匹配。Typescript类型模式匹配我们知道,字符串可以用正则表达式进行模式匹配,找到匹配的部分,提取子组,然后用$1、$2等来引用匹配到的子组。Typescript类型也可以进行模式匹配。比如提取Promise的值类型:我们使用extends对传入的类型参数T做模式匹配,这里需要提取值部分,通过infer类声明一个局部变量R来保存。如果匹配,则返回匹配的值。R,否则返回never,即不匹配。这是Typescript类型的模式匹配。总结一下:Typescript类型的模式匹配就是通过extends匹配类型参数,结果保存在通过infer声明的局部类型变量中。如果匹配,则可以从局部变量中获取提取的类型。这个模式匹配例程有多有用?下面看看在数组、字符串、函数等类型中的应用。数组类型的模式匹配poppop就是去掉最后一个元素,可以通过模式匹配来实现:我们通过模式匹配取出最后一个元素的类型和前一个元素的类型,用infer放到不同的变量中,然后构造一个新的返回的数组类型。同样,shift是去掉第一个元素,也是用类似的匹配方式实现的:string类型的模式匹配trimtrim是去掉前后的空格、制表符、换行符,然后通过模式匹配把后面的字符去掉,并通过infer放入一个新变量并返回它。先实现TrimLeft:如果匹配,继续递归TrimLeft,直到前面没有空白字符。然后实现TrimRight:然后把两者结合起来,即Trim:replacereplace是替换字符串的一部分,可以通过模式匹配把这个字符串前后的子串取出来,通过infer放到不同的变量中,然后用替换部分新字符串。函数类型的模式匹配参数类型通过模式匹配取出参数类型得到参数部分,放入infer声明的变量中返回。返回值类型提取返回值类型也是通过模式匹配得到返回值部分,放入infer声明的类型变量中返回。总结类型编程就是对类型参数(泛型类型)进行一系列操作后返回一个新的类型,也叫类型体操。打字体操可以实现很多复杂的逻辑,学起来也比较困难,但是掌握一些套路后很快就能掌握。这些例程中最常用的是模式匹配,类似于字符串匹配和提取子串,类型也可以通过extends匹配类型参数,将要提取的部分保存在通过infer声明的局部类型变量中。类型参数的模式匹配套路在字符串类型、数组类型、函数类型等都有大量的应用,掌握这个套路可以让类型体操的水平提高很多。
