[英]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.