如何让TypeScript泛型更具体?无需使用as const的解决方案
解决TypeScript数组参数字面量类型推断问题
原函数定义:
function createStats<K extends string[]>(arr: K): Stats<K[number]>
调用createStats(["maxHealth"])时,返回类型是Stats<string>,但期望得到Stats<"maxHealth">,不想用as const的话,可以通过以下两种方式解决:
方法1:使用const泛型(TypeScript 5.0+)
直接在泛型参数前添加const修饰符,让TypeScript保留数组元素的字面量类型:
function createStats<const K extends string[]>(arr: K): Stats<K[number]> { // 函数逻辑实现 } // 调用示例 const testStats = createStats(["maxHealth"]); // testStats 类型为 Stats<"maxHealth">
方法2:readonly数组约束(兼容低版本TS)
通过readonly数组约束结合展开运算符,强制TypeScript推断字面量类型:
function createStats<K extends readonly string[]>(arr: readonly [...K]): Stats<K[number]> { // 函数逻辑实现 } // 调用示例 const testStats = createStats(["maxHealth"]); // testStats 类型为 Stats<"maxHealth">
原理说明
原函数中,TypeScript默认会将数组参数推断为宽泛的string[]类型,导致K[number]被解析为string。上述两种方式都是通过修改类型约束,让TypeScript不再自动拓宽数组元素的类型,从而保留原始的字面量信息。
内容的提问来源于stack exchange,提问作者Romich
相关产品推荐
相关产品推荐

