You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何定义仅允许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>'

代码解释

  1. 避免分布式条件类型:用[T] extends [string]代替T extends string,这样联合类型不会被拆分成单个成员处理,确保string | number不会被误判为string。
  2. 编译错误触发:通过T extends EnsureValid<T>的泛型约束,当输入单独string时,EnsureValid<string>返回never,string extends never不成立,直接抛出编译错误。
  3. 类型保留:对于number或string | number,EnsureValid<T>直接返回原类型,满足需求。

内容的提问来源于stack exchange,提问作者Nimai

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 05:45:41