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

如何在TypeScript中实现IsLiteralType判断字面量类型?

实现判断Number类型是否为字面量的IsLiteralType

在TypeScript中,要区分number字面量类型(如5、3.14)和宽泛的number类型,可以利用类型系统的子类型特性实现IsLiteralType:

核心逻辑

字面量类型是number的子类型,但宽泛的number类型无法赋值给字面量类型。我们通过判断number是否能赋值给类型参数N来区分:如果number extends N成立,说明N是宽泛的number类型;反之则是字面量类型。

实现代码

type IsLiteralType<N extends number> = number extends N ? false : true;

验证示例

// 字面量类型返回true
type TestLiteral = IsLiteralType<5>; // true
type TestDecimalLiteral = IsLiteralType<3.14>; // true

// 宽泛number类型返回false
type TestWideNumber = IsLiteralType<number>; // false

在FixedArray中的实际应用

结合条件类型,可根据IsLiteralType的结果生成不同的数组类型:

type FixedArray<N extends number, T> = IsLiteralType<N> extends true 
  ? T[] & { length: N } // 字面量类型时,生成固定长度的强约束数组
  : T[]; // 宽泛number类型时,返回普通数组

// 固定长度数组示例
type StringArrayOf5 = FixedArray<5, string>; // string[] & { length: 5 }
const validArr: StringArrayOf5 = ["a", "b", "c", "d", "e"]; // 合法
const invalidArr: StringArrayOf5 = ["a", "b"]; // 类型错误:长度不匹配

// 普通数组示例
type AnyLengthNumberArray = FixedArray<number, number>; // number[]
const arr1: AnyLengthNumberArray = [1,2,3]; // 合法
const arr2: AnyLengthNumberArray = [1]; // 合法

扩展说明

  • 若需支持string、boolean字面量的判断,可将泛型约束调整为N extends string | number | boolean。
  • 联合字面量类型(如5 | 10)会返回true,因为number无法赋值给该联合类型。

内容的提问来源于stack exchange,提问作者Jean-Philippe Pellet

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 00:52:37