TypeScript如何定义仅支持MyLetter数组或其与MyNumber交替的数组类型?
解决方案
完整实现代码
// 题目给定的基础类型 type MyLetter = 'A' | 'B' | 'C' type MyNumber = 1 | 3 | 5 // 简化别名:单个字母数组类型 type LetterArr = MyLetter[] // 互递归定义交替序列规则 // 下一个位置需要放MyNumber的状态:可以直接结束,也可以放一个MyNumber后进入「需要放LetterArr」的状态 type ExpectNumber = [] | [MyNumber, ...ExpectLetter] // 下一个位置需要放LetterArr的状态:必须先放一个LetterArr,之后进入「需要放MyNumber」的状态 type ExpectLetter = [LetterArr, ...ExpectNumber] // 最终目标类型:两类合法结构的并集 type TargetArray = // 第一类:完全由LetterArr构成的数组 | LetterArr[] // 第二类:严格交替排列的数组 | ExpectLetter
校验效果验证
合法示例(无TS类型报错)
// 交替结构示例 const valid1: TargetArray = [['A', 'B'], 1, ['C', 'A'], 3] // 仅一个LetterArr的示例(同时属于两类合法结构) const valid2: TargetArray = [['B']] // 全LetterArr结构示例 const valid3: TargetArray = [['A'], ['B'], ['C']]
非法示例(触发TS类型报错)
// 出现非法值true+非允许的数字2 const invalid1: TargetArray = [['A', 'B'], true, ['C', 'A'], 2] // 元素是单个字母而非字母数组 const invalid2: TargetArray = ['B'] // 首元素是数字而非字母数组 const invalid3: TargetArray = [1] // 首元素是数字,顺序错误 const invalid4: TargetArray = [1, ['A', 'B'], ['C', 'A'], 2]
实现逻辑说明
- 用互递归的两个类型
ExpectLetter和ExpectNumber约束交替排列的顺序,保证序列一定以LetterArr开头,之后MyNumber和LetterArr严格交替,允许在任意位置结束 - 第一类全
LetterArr的结构直接用LetterArr[]实现,和交替结构取并集就覆盖了所有合法场景
内容的提问来源于stack exchange,提问作者Hossein Hammad
相关产品推荐
相关产品推荐

