如何定义仅允许number或string|number的TypeScript类型?
解决方案:限制TypeScript类型为
number或string | number,禁止单独string 问题回顾
需要定义一个类型,仅允许number或string | number作为输入:
- 输入
string | number时,需保留原联合类型 - 输入
number时,返回number(符合预期) - 输入
string时,直接触发编译错误(而非返回never)
之前的代码因分布式条件类型导致联合类型被拆分处理,最终返回number而非预期的联合类型。
实现代码
// 核心判断逻辑:排除严格的string类型,保留number或string|number type EnsureValid<T> = T extends string | number ? ([T] extends [string] ? never : T) : never; // 泛型约束触发编译错误:仅允许符合条件的类型通过 type ValidType<T extends EnsureValid<T>> = T; // 测试用例 type StringOrNumber = ValidType<string | number>; // 正确,类型为string | number type JustNumber = ValidType<number>; // 正确,类型为number type JustString = ValidType<string>; // 编译错误:类型'string'不满足约束'EnsureValid<string>'
代码解释
- 避免分布式条件类型:用
[T] extends [string]代替T extends string,这样联合类型不会被拆分成单个成员处理,确保string | number不会被误判为string。 - 编译错误触发:通过
T extends EnsureValid<T>的泛型约束,当输入单独string时,EnsureValid<string>返回never,string extends never不成立,直接抛出编译错误。 - 类型保留:对于
number或string | number,EnsureValid<T>直接返回原类型,满足需求。
内容的提问来源于stack exchange,提问作者Nimai
相关产品推荐
相关产品推荐

