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

如何让TypeScript泛型函数仅接受值为string类型的索引键?

解决TypeScript泛型约束:仅允许值类型为string的键作为泛型参数

可以通过条件类型结合类型推导,实现对泛型参数K的精确约束,确保它只能是T中值类型为string的键。

正确的函数定义

最直观的实现方式是先构造出T中所有值类型为string的键的联合类型,再将K约束为该类型:

const func = <T extends {}, K extends { [P in keyof T]: T[P] extends string ? P : never }[keyof T]>() => {};

也可以用TypeScript内置的Extract工具类型简化写法,逻辑完全一致:

const func = <T extends {}, K extends Extract<keyof T, { [P in keyof T]: T[P] extends string ? P : never }[keyof T]>>() => {};

逻辑拆解

  1. { [P in keyof T]: T[P] extends string ? P : never }:遍历T的所有键,将值类型为string的键保留为自身类型,其余键映射为never
  2. [keyof T]:通过索引访问,从上述映射类型中提取出所有有效键的联合类型
  3. 将K约束为该联合类型,自然就只允许传入符合要求的键

测试验证

用你定义的Form接口测试约束效果:

interface Form {
  a: boolean;
  b: string;
}

// 正常执行,无报错
func<Form, "b">();

// 报错:类型'"a"'不满足约束要求
func<Form, "a">();

内容的提问来源于stack exchange,提问作者Andrius Juškevičius

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 16:05:32