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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 15:02:48