TypeScript 类型系统极限探索

图片

TypeScript的类型系统是图灵完备的:这意味着它具有条件分支(条件类型)并可以使用任意大量的内存。因此,您可以将类型系统作为其自己的编程语言来使用,包括变量、函数和递归。开发人员已经在类型系统中扩展了类型操作的边界,以编写一些非常令人难以置信的东西!

本文收集了 TypeScript 开发人员对类型系统能够实现的功能的探索成果。它们从二进制算术和基本虚拟机到迷宫解算器和完整的编程语言。
 

这不正常

大多数应用都试图尽可能少地使用极端类型操作。类型系统中的复杂逻辑会变得难以阅读,而且很难快速调试。因此,建议:

如果你发现有必要使用类型运算,为了那些需要阅读你的代码的开发人员,包括未来的你,请尽量将它们保持在最小值。使用可读性强的名称,以帮助读者在阅读时理解代码。对于你认为未来的读者可能会遇到困难的任何内容,请留下描述性的注释。

请不要看下面的项目列表,认为你需要理解它们才能使用 TypeScript。这些项目很荒谬。它们相当于代码高尔夫:对少数人来说是一种有趣的活动,但对大多数日常工作没有用处。
 

项目列表

按时间先后排序。所有项目都附有解释说明,解释了它们是如何工作的。
 

四位虚拟机

阿什利·克莱默,2019年9月

所以,我和同事开玩笑的时候有点失控了,我用 @typescript 写了一个 4-Bit 虚拟机,只使用了 Types,没有 JavaScript。

这个文档完善的类型集设置了一个“虚拟机”,允许操纵一个 4 位堆栈。它导出的  VM  类型接受一个程序指令数组,如  "push"  和  "peek" ,并模拟对每个指令的堆栈的操纵。它甚至还提供了 20 个命令的 fizz buzz 实现。非常令人印象深刻。https://gist.github.com/acutmore/9d2ce837f019608f26ff54e0b1c23d6e

二进制算术

乔什·戈德堡,2019年10月

type Bit = 0 | 1;

这个项目还在类型系统中实现了低级位操作逻辑。它比4位VM的扩展性要小,并且“仅仅”包括8位整数操作。https://blog.joshuakgoldberg.com/binary-arithmetic

迷宫解谜器及其他

罗内恩·艾米尔,2020年2月

这个项目试图通过在 TypeScript 的类型系统之上实现各种函数和算法,将 TypeScript 的类型系统推向极限。

Ronen不仅在类型系统中提供了最短路径迷宫求解器,而且还提供了一整套函数,包括数字算术、列表操作、数组排序算法和谜题求解。其中的谜题求解器尤其突出,它对许多类型系统特性的运用得到了广泛的评论。https://github.com/ronami/meta-typing

FizzBuzz

加尔·施莱辛格,2020年2月

这篇博客展示了如何在 TypeScript 中只使用类型来实现 FizzBuzz - 没有任何运行时代码。

这种巧妙的方法演示了如何纯粹在类型系统中设置递归逻辑和数字运算。最后给出了一个处理数字的完整 FizzBuzz 实现。https://gal.hagever.com/posts/typing-the-technical-interview-in-typescript
 

TXState

Devansh Jethmalani, 2020年8月

静态输入 xstate 的尝试。

XState是JavaScript和TypeScript中一个流行的状态机和状态图库。TXState设法获取这些特性,并在类型系统中完全运行它们。完整的Twitter thread显示了Devansh几个月的写作旅程,并链接到各种线程上的一些有见地的讨论。

Devansh 还有一个有趣的类型谓词 eDSL 项目,它在类型系统中大量使用了解析: @sthir/predicate 。https://github.com/devanshj/txstate

SQL数据库引擎

查尔斯·皮克,2020年9月

一个纯粹在 TypeScript 类型注释中实现的 SQL 数据库。

这个列表中第一个条目,在类型系统中广泛使用字符串解析。查询通过将原始 SQL 字符串解析为语句来运行,然后根据数据库的当前状态计算语句。它支持返回类型系统对象数组的  SELECT  语句,以及返回新数据库内容作为类型的  INSERT 、 UPDATE  和  DELETE  语句。https://github.com/codemix/ts-sql

语言翻译

罗内恩·艾米尔,2020年10月

一个小型的语言解释器,完全在 TypeScript 的类型系统中实现。

Ronen的另一个有趣的项目:这一次,是一门完整的语言!它支持类似于 Lisp 的语法,包括  add 、 join  和  or  等命令,以及函数和变量。你不得不想知道是否可以用这种语言实现 TypeScript 本身......https://github.com/ronami/typelang

井字游戏

乔什·戈德堡,2020年10月

我们将学习如何使用模板字符串,在上面模拟三棋游戏,并确定游戏的赢家是谁。

这个有趣的会议演讲附加使用模板字面量字符串解析将游戏步骤的描述转换为放置棋子的棋盘。检查游戏胜利是通过对棋盘元组进行一组可赋值性检查来完成的。https://blog.joshuakgoldberg.com/type-system-game-engines

分词器/解析器/解释器

Anurag Hazra, 2022年4月

一个实验性的分词器/解析器/解释器,完全在类型级别上编写,以推动 TypeScript 类型系统的极限。

标记化、解析和解释的每个部分都令人印象深刻。这个项目通过在类型系统中实现一个完全可工作的语言,将它们都带到了一个新的水平。绝对荒谬。

Anurag 在 GitHub 上也有其他伟大的类型系统探索的集合:github.com/anuraghazra/type-trident 。https://github.com/anuraghazra/typelevel-parser

HypeScript

Ronen Amiel, 2022年7月

结果表明,在 TypeScript 的类型系统中实现 TypeScript 的类型系统是可能的。

这是Ronen的又一个创造,它是用TypeScript的类型注释写成的TypeScript类型系统的简化实现。它实现了类型系统中一个非常大的子集:变量、函数、数组、对象等等!https://github.com/ronami/HypeScript

N-Queens

理查德·塔尔斯,2023年3月

“好吧,这看起来像一个正确的解决方案,但代码很难遵循,而且它不是很简洁。” 他断言,错误。

“哦,这大部分只是 TypeScript 样板代码。我想你会发现一旦它被编译成 JavaScript,它就非常简洁了。” 你安慰他。

在技术访谈中,Richard向我们展示了TypeScript的类型系统如何解决一个难题,“N-Queens”。给定一个NxN的棋盘,你需要找到一种方法来安全地将N个皇后放在棋盘上。如果一个皇后在同一行、列或对角线上,则会威胁另一个皇后。https://www.richard-towers.com/2023/03/11/typescripting-the-technical-interview.html

类型系统象棋

丹尼尔·詹姆斯,2023年7月

这个仓库包含完全在(稳定的) Rust 和 Typescript 类型系统中实现的象棋。这两种语言都具有完整的类型系统,使其成为可能。

在两种类型系统中近乎完整的象棋实现,包括移位、提升等。TypeScript 版本还包括针对 Forsyth-Edwards Notation (FEN) 解析器的字符串解析。https://github.com/Dragon-Hatcher/type-system-chess

二进制算术和排序

丹尼斯·卢基切夫,2023 年 8 月

主要目标是添加数字和对数字数组进行排序,所有操作都在类型级别,没有任何运行时执行。这可能使 TypeScript 成为世界上最快的语言,运行时精确到零。️ 只是有点好玩,但它的可能性很迷人,不是吗?

这个有趣的项目通过添加二进制算术和归并排序来扩展将数字表示为元组的想法。https://github.com/psea/typescript-typelevel-binary-arithmetic
 

更多资源

GitHub上的类型挑战库包含了一组很棒的类型挑战,从基础开始,一直到非常复杂的元编程。我强烈建议使用它们来帮助你完成像本文中提到的那些项目。
https://github.com/type-challenges/type-challenges

 欢迎关注公众号:文本魔术,了解更多

  • 54
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值