在给定以下条件的情况下,Render方法的参数value的类型为string | number.

如何确保它的类型为T[dataIndex],在 case dataIndex: 'name'中为string,在 case dataIndex: 'id'中为number

import * as React from 'react'

type Col<T extends object, K extends keyof T> = {
    title: string;
    dataIndex: K;
    render: (value: T[K]) => React.ReactNode;
};

function Tab<T extends object, K extends keyof T = keyof T>(list: T[], cols: Col<T, K>[]): JSX.Element {
    return (
        <table>
            <thead>
                <tr>
                    {cols.map(col => (
                        <th key={col.title}>{col.title}</th>
                    ))}
                </tr>
            </thead>
            <tbody>
                {list.map((item, i) => (
                    <tr key={i}>
                        {cols.map(col => (
                            <td key={col.title} children={col.render(item[col.dataIndex])} />
                        ))}
                    </tr>
                ))}
            </tbody>
        </table>
    );
}

Tab(
    [
        { id: 1, name: 'Hello' },
        { id: 2, name: 'World' }
    ],
    [
        {
            title: 'Name',
            dataIndex: 'name',
            render: value => <span>{value.length}</span>
        },
        {
            title: 'Id',
            dataIndex: 'id',
            render: value => <span>{value}</span>
        }
    ]
);

Playground link

推荐答案

您需要一个额外的组件类型参数来捕获实际用作元组的键.然后,您可以使用映射类型将其映射到列的数组,TypeScrip将能够遵循反向映射并从数组推断K,然后返回并正确地键入参数.

type ColMapping<T extends object, K extends Record<number, keyof T>> = {
    [P in keyof K ]: Col<T, K[P] & keyof T>
}


function Tab<T extends object, K extends (keyof T)[]>(list: T[], cols: ColMapping<T, K>): JSX.Element {
//...
}

Playground Link

Typescript相关问答推荐

根据另一个成员推断类成员的类型

为什么在TypScript中写入typeof someArray[number]有效?

如何使用axios在前端显示错误体

Angular 17 Select 错误core.mjs:6531错误错误:NG 05105:发现意外合成监听器@transformPanel.done

如何在单击停止录制按钮后停用摄像机?(使用React.js和Reaction-Media-Recorder)

Typescript泛型类型:按其嵌套属性映射记录列表

无法从Chrome清除还原的初始状态数据

为什么T[数字]不也返回UNDEFINED?

如何使用类型谓词将类型限制为不可赋值的类型?

对未到达受保护路由的路由环境做出react

在对象中将缺省值设置为空值

剧作家元素发现,但继续显示为隐藏

基于泛型的条件接口键

如何从一个泛型类型推断多个类型

TS2739将接口类型变量赋值给具体变量

TypeScrip-如何自动推断UNION变量的类型

对于VUE3,错误XX不存在于从不存在的类型上意味着什么?

递归类型别名的Typescript 使用

什么';是并类型A|B的点,其中B是A的子类?

基于参数的 TS 返回类型