如何定义可校验有效十六进制字符串的TypeScript类型?
如何定义支持任意长度的合法十六进制字符串TypeScript类型
要实现能校验长度为偶数且仅包含十六进制字符的ByteString类型,可以利用TypeScript的递归模板字符串类型来实现,以下是具体方案:
完整类型定义
// 枚举所有合法的十六进制字符(包含大小写) type HexChar = '0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9' | 'a' | 'b' | 'c' | 'd' | 'e' | 'f' | 'A' | 'B' | 'C' | 'D' | 'E' | 'F'; // 单个字节对应的两位十六进制字符组合 type BytePair = `${HexChar}${HexChar}`; // 递归定义:空字符串 或 一个BytePair拼接另一个ByteString,保证总长度为偶数 type ByteString = '' | `${BytePair}${ByteString}`;
验证示例
// 合法场景:长度偶数+全十六进制字符 let validStr: ByteString = "01afe3"; let emptyStr: ByteString = ""; // 空字符串默认合法(不需要可移除定义里的'') let longValidStr: ByteString = "A1B2C3D4E5F610"; // 非法场景:类型会直接报错 let invalidLength: ByteString = "0a1"; // 错误:长度为奇数 let invalidChar: ByteString = "hello"; // 错误:包含非十六进制字符 let mixedInvalid: ByteString = "0g23"; // 错误:包含非法字符'g'
说明和调整
- 大小写支持:如果只需要小写或大写的十六进制字符,直接从
HexChar中移除对应的字符组即可。 - 空字符串控制:如果不允许空字符串作为合法值,将
ByteString的定义改为type ByteString =${BytePair}${ByteString};即可。 - 递归深度限制:TypeScript对递归类型的深度有一定限制,极长的字符串(如数千字符)可能会绕过类型检查,但日常业务场景下完全够用。
内容的提问来源于stack exchange,提问作者qtom zheng
相关产品推荐
相关产品推荐

