TypeScript如何定义限定字符为0/1、可指定长度的二进制字符串类型
实现方案
任意长度二进制字符串类型
基于TypeScript递归模板字面量实现,支持0到TS递归深度上限长度的二进制字符串约束:
type Binary = '0' | '1'; type BinaryStr = '' | Binary | `${Binary}${BinaryStr}`;
校验规则说明
- 支持空字符串、单字符、任意组合的0/1字符串
- 包含非0/1字符的字符串会触发类型报错
- 受TS类型递归深度限制,默认支持最大长度约为20位,超过此长度的超长字符串可能会触发类型递归深度警告
可指定长度的二进制字符串类型
通过元组长度计数实现灵活的长度指定,无需手动拼接模板字面量:
type Binary = '0' | '1'; // 工具类型:泛型参数Len为要指定的二进制字符串长度 type FixedBinary<Len extends number, _acc extends Binary[] = []> = _acc['length'] extends Len ? `${_acc[number]}` : FixedBinary<Len, [..._acc, Binary]>;
使用示例
// 定义5位长度的二进制字符串类型,等价于你手动拼接的BinaryInput type FiveBitBinary = FixedBinary<5>; // 合法用例 const demo1: FiveBitBinary = '10101'; // 非法用例:长度不匹配 const demo2: FiveBitBinary = '1010'; // 非法用例:包含非0/1字符 const demo3: FiveBitBinary = '10201';
注意事项
- 长度参数建议控制在20以内,过长的长度会导致类型计算变慢,甚至触发TS类型实例化过深的报错
- 如果需要支持超长二进制串,建议搭配运行时正则校验
/^[01]*$/配合类型断言使用
内容的提问来源于stack exchange,提问作者stackoverfloweth
相关产品推荐
相关产品推荐

