TypeScript泛型场景下,如何无需类型断言指定泛型键对应字符串值?
解决方案
步骤1:定义工具类型提取值为string的键
先写一个工具类型,用来筛选出对象类型中值为string类型的所有键:
type StringKeys<T> = { [K in keyof T]: T[K] extends string ? K : never }[keyof T];
这个类型会遍历T的所有键,只保留那些对应值是string的键,剩下的键会被标记为never,最终得到符合要求的键的联合类型。
步骤2:修改TableConfig接口约束idName
把TableConfig里的idName类型从keyof T改成上面定义的StringKeys<T>,强制idName必须指向T中值为string的字段:
interface Table<T> { data: T[]; tableConfig: TableConfig<T>; } interface TableConfig<T> { fieldNames: Array<keyof T>; idName: StringKeys<T>; // 此处修改约束 }
步骤3:在组件中直接使用,无需类型断言
现在当你访问row[tableConfig.idName]时,TypeScript会自动推断出它的类型是string,直接传给Controller的name属性即可:
{data.map((row) => ( <StyledRowItem> <td> <Controller name={row[tableConfig.idName]} // 无需再加`as string`断言 {/* 其他属性 */} /> </td> </StyledRowItem> ))}
额外类型安全保障
当你传入具体业务类型时,TypeScript会自动校验idName的合法性。比如定义User类型:
interface User { id: string; name: string; age: number; }
如果把idName设为"age"(对应值是number),TS会直接报错,确保你不会传入不符合要求的键。
内容的提问来源于stack exchange,提问作者Vadym Makhonin
相关产品推荐
相关产品推荐

