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

如何让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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 19:27:37