如何在TypeScript中定义多米诺骨牌式匹配对组成的数组类型别名
实现多米诺骨牌式的TypeScript链式类型
你的需求是创建一个能强制数组元素像多米诺骨牌一样衔接的类型别名,这个思路很有意思!你的初始尝试方向是对的,但递归参数的传递和约束处理有点问题——尤其是用any作为默认值会让TypeScript放松类型检查,导致无法检测到不匹配的情况。
下面是可以正常工作的实现方案:
// 定义单个多米诺骨牌:二元元组,左值和右值类型可以任意 type Domino<Left, Right> = [Left, Right]; // 辅助类型:约束后续的骨牌链必须以指定类型作为左值起始 type DominoChainStartWith<T> = // 要么是一个以T为左值的单个骨牌 [Domino<T, any>] // 要么是一个以T为左值的骨牌,后面跟着以该骨牌右值为起始的递归链 | [Domino<T, infer Next>, ...DominoChainStartWith<Next>]; // 主链式类型:覆盖所有合法的多米诺链情况 type DominoChain = | [] // 空链合法 | [Domino<any, any>] // 单个骨牌合法,无需衔接 | [Domino<infer FirstLeft, infer FirstRight>, ...DominoChainStartWith<FirstRight>]; // 多骨牌必须衔接
测试你的案例
把这个类型用在你的例子中,合法的案例会正常通过,不合法的案例会触发编译器报错:
// 全部合法 const chain1: DominoChain = [ ["A","B"], ["B","C"], ["C","D"], ["D","E"] ]; const chain2: DominoChain = [ [3, 4], [4, 2], [2, 1] ]; const chain3: DominoChain = [ [3, null], [null, {}], [{}, undefined] ]; const chain4: DominoChain = [ [1, 2] ]; const chain5: DominoChain = [ ]; // 编译器会报错:类型"3"不能赋值给类型"2" const chain6: DominoChain = [ [1, 2], [3, 4] ];
实现逻辑解释
Domino类型:简单明了,就是表示单个骨牌的二元元组,明确区分左值和右值的类型。DominoChainStartWith<T>:这是实现多米诺衔接的核心递归类型。它要求所有后续的骨牌必须以T作为左值,每处理一个骨牌,就把它的右值作为下一个递归链的起始类型,形成严格的衔接约束。DominoChain:整合了所有合法的链场景:空数组、单个独立骨牌,以及第一个骨牌后接匹配的递归链,确保所有多骨牌的情况都满足多米诺衔接规则。
注意:这个实现需要TypeScript 4.5及以上版本,因为更早的版本对递归条件类型的支持有限。
内容的提问来源于stack exchange,提问作者Zomono
相关产品推荐
相关产品推荐

