简体   繁体   English

在 Typescript 中的接口中推断类型

[英]Infer type in interface in Typescript

I have this implementation of renderTable function我有这个renderTable function 的实现

interface Column<T> {
  key: keyof T,
  cellRenderer: (params: {rowData: T, cellData: any}) => void 
}

function renderTable<T>(data: T[], columns: Column<T>[]) {
    data.forEach((rowData) => {
        columns.forEach((column) => {
            const cellData = rowData[column.key]
            column.cellRenderer({rowData, cellData})
        })
    })
}

interface DataType {
  name: string,
  age: number;
}

const data: DataType[] = [
    {name: 'Anry', age: 20},
    {name: 'Brain', age: 30},
]

const columns: Column<DataType>[] = [
    {
        key: 'name',
        cellRenderer: ({cellData}) => {
            console.log('name is', cellData)
        }
    },

    {
        key: 'age',
        cellRenderer: ({cellData}) => {
            console.log('age is', cellData)
        }
    }
]

renderTable<DataType>(data, columns)

I want the compiler to understand that in first column cellData is string and in second column cellData is number我希望编译器了解第一列 cellData 是字符串,第二列 cellData 是数字

Is there a way to change Column interface to do it?有没有办法改变Column界面来做到这一点?

This might help.这可能会有所帮助。 changed from any to cellData: T[keyof T]} and Column changed from an interface to type.从 any 更改为cellData: T[keyof T]}和 Column 从接口更改为类型。

type Column<T> = { [K in keyof T]: { 
    key: K;
    cellRenderer: (params: {rowData: T, cellData: T[K]}) => void 
   
    } 
  }[keyof T]
function renderTable<T>(data: T[], columns: Column<T>[]) {
    data.forEach((rowData) => {
        columns.forEach((column) => {
            const cellData = rowData[column.key]
            column.cellRenderer({rowData, cellData})
        })
    })
}

interface DataType {
  name: string,
  age: number;
}

const data: DataType[] = [
    {name: 'Anry', age: 20},
    {name: 'Brain', age: 30},
]

const columns: Column<DataType>[] = [
    {
        key: 'name',
        cellRenderer: ({cellData}) => {
            console.log('name is', cellData)
        }
    },

    {
        key: 'age',
        cellRenderer: ({cellData}) => {
            console.log('age is', cellData)
        }
    }
]

renderTable<DataType>(data, columns)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM