如何在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
相关产品推荐
相关产品推荐

