TypeScript如何获取string字面量联合类型的可选值总数量?
核心结论
不存在你预期的直接接收SomeType类型作为入参的函数。TypeScript属于静态类型语言,所有类型定义仅在编译阶段做类型校验使用,编译为JavaScript后所有类型都会被完全擦除,你定义的SomeType联合类型在运行时不存在,无法直接作为参数传入函数。
可行替代实现方案
你可以通过「运行时实体 + 反向推导类型」的方式实现需求,不需要单独维护两套定义,两种常用实现如下:
方案1:const数组 + 类型推导
// 先定义运行时可用的取值数组,用as const锁定值类型 const SomeTypeValues = ['a', 'b', 'c'] as const // 从数组推导联合类型,和你原始定义的SomeType效果完全一致 type SomeType = typeof SomeTypeValues[number] // 取值数量直接读取数组length即可 const count = SomeTypeValues.length // 也可以封装为通用函数 function getUnionValueCount<T extends readonly unknown[]>(arr: T) { return arr.length } // 调用效果符合预期 assertEq(getUnionValueCount(SomeTypeValues), 3)
方案2:枚举实现
枚举是TypeScript少数会保留运行时实体的类型特性,也可以实现需求:
enum SomeType { a = 'a', b = 'b', c = 'c' } // 通用枚举值计数函数 function getEnumValueCount(e: object) { return Object.keys(e).length } assertEq(getEnumValueCount(SomeType), 3)
内容的提问来源于stack exchange,提问作者DraganS
相关产品推荐
相关产品推荐

