是否可能根据键dataIndex的值获取动态类型(使用泛型创建动态区分联合类型)?

type EntityList<EntityType> = {
  dataIndex: keyof EntityType;
  render?: (value: any /*bad*/, record: EntityType) => void;
}[]

// Some dynamic type
type Issue = {
  id: number;
  name: string;
  description?: string;
  flag?: boolean;
};

const arr:EntityList<Issue> = [
  { dataIndex: 'id', render: (id, record) => { 
    console.log({id, record}); } // id should be number
  }, 

  { dataIndex: 'name', render: (name, record) => { 
    console.log({name, record}); } // name should be string
  }, 

  { dataIndex: 'flag', render: (flag, record) => { 
    console.log({flag, record}); } // flag should be boolean
   }, 
]

答复:

type EntityList<EntityType> = {
  [K in keyof EntityType]: {
    dataIndex: K, 
    render?: (value: EntityType[K], record: EntityType) => void
  }
}[keyof EntityType][]

谢谢@Tobias S.

推荐答案

这应该对你有用:

type EntityList<EntityType> = {
  [K in keyof Issue]: {
    dataIndex: K, 
    render?: (value: Issue[K], record: EntityType) => void
  }
}[keyof Issue][]

我们创建一个映射类型,并迭代所有Issue个键.之后,我们将这种类型转换为[keyof Issue]的所有可能组合的并集.

Playground

这不太符合您的要求,因为您希望flagboolean型.但由于flag属性是可选的,所以类型是boolean | undefined.要解决此问题,请添加-?:

type EntityList<EntityType> = {
  [K in keyof Issue]-?: {
    dataIndex: K, 
    render?: (value: Issue[K], record: EntityType) => void
  }
}[keyof Issue][]

Typescript相关问答推荐

条件类型中的Typescript二元组推理

返回签名与其他类型正确的函数不同的函数

交叉点对数字和布尔的处理方式不同

为什么ESLint抱怨通用对象类型?

APP_INITIALIZER—TypeError:appInits不是函数

在Angular中,如何在文件上传后清除文件上传文本框

对深度对象键/路径进行适当的智能感知和类型判断,作为函数参数,而不会触发递归类型限制器

为什么TypeScript假设文档对象始终可用?

如何将泛型对象作为返回类型添加到类型脚本中

缩小并集子键后重新构造类型

AngularJS服务不会解析传入的Json响应到管道中的模型

推断从其他类型派生的类型

如何在React组件中指定forwardRef是可选的?

带投掷的收窄类型

S,为什么我的T扩展未定义的条件在属性的上下文中不起作用?

如何在具有嵌套数组的接口中允许新属性

使用&reaction测试库&如何使用提供程序包装我的所有测试组件

TypeScript是否不知道其他函数内部的类型判断?

如何从联合类型推断函数参数?

如何在TypeScript中声明逆变函数成员?