如何让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]>>() => {};
逻辑拆解
{ [P in keyof T]: T[P] extends string ? P : never }:遍历T的所有键,将值类型为string的键保留为自身类型,其余键映射为never[keyof T]:通过索引访问,从上述映射类型中提取出所有有效键的联合类型- 将
K约束为该联合类型,自然就只允许传入符合要求的键
测试验证
用你定义的Form接口测试约束效果:
interface Form { a: boolean; b: string; } // 正常执行,无报错 func<Form, "b">(); // 报错:类型'"a"'不满足约束要求 func<Form, "a">();
内容的提问来源于stack exchange,提问作者Andrius Juškevičius
相关产品推荐
相关产品推荐

