是否可以基于对象属性进行动态类型化?

塞缪尔·赫拉(Samuel Hulla)

我有以下结构:

type ErrorObject = {
  name: string,
  message: string,
}

const ALL_ERRORS: ErrorObject[] = [
   {
     name: 'No-empty-name',
     message: 'You must provide a name',
   },
   {
     name: 'No-empty-age',
     message: 'You must provide an age',
   },
   {
     name: 'No-under-18',
     message: 'You must be 18+ to continue',
   }
]

现在,我正在尝试创建一个类型,该类型将定义所有可能的error name,最终应如下所示:

type PossibleErrorNames = 'No-empty-name' | 'No-empty-age' | 'No-under-18'

这可以正常工作,但是在我的实际项目中,显然数组要大得多,并且更新两种类型都感觉太迟钝了,因为它们之间会相互依赖(如果更新一种,则必须更新另一种)。


我尝试了以下方法:

const ALL_NAMES = ALL_ERRORS.map(err => `'${err.name}'`).join(' | ')
type PossibleErrorNames = ALL_NAMES

这里的问题是,这是不正确的,因为它将ALL_NAMES返回为

"'No-empty-name' | 'No-empty-age' | 'No-under-18'"这是一个string


显然,这是的预期行为join(),但是有没有办法

  1. 将字符串转换为表达式
  2. ALL_ERRORS数组中推断类型的也许更优雅的名称
虫子

您可以将其用作const断言,并执行类似的操作,前提是在编译时知道完整的数组。

type ErrorObject = {
  name: string,
  message: string
}


const ALL_ERRORS = [
   {
     name: 'No-empty-name',
     message: 'You must provide a name',
   },
   {
     name: 'No-empty-age',
     message: 'You must provide an age',
   },
   {
     name: 'No-under-18',
     message: 'You must be 18+ to continue',
   }
] as const // <----- notice here

type PossibleErrorNames = typeof ALL_ERRORS[number]["name"]
// "No-empty-name" | "No-empty-age" | "No-under-18"

操场

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

是否可以基于父组件的道具在extends:属性中动态添加图表类型?

是否可以将对象中函数的流类型动态设置为其属性之一的类型?

如果动态添加属性,是否可以在TypeScript中声明对象的属性类型?

是否可以基于子属性对Jinja2中的对象列表进行排序?

使用NodeJS进行动态对象遍历

合并对象以进行动态 rethinkdb 查询

是否可以使用ElasticSearch.Net或Nest进行动态响应

是否可以使用C#编译器添加PostSharp进行动态编译

C#建立一个对象以进行动态序列化

是否可以动态更改实体属性的学说类型?

是否可以在Java中动态设置对象属性(无反射)?

是否可以向JavaScript对象添加动态命名的属性?

在列表中,可以基于Typescript中的对象属性获取对象的对象类型。

是否可以确保对象完整性并保留属性类型?

是否可以使用属性初始化.NET类型?

使用Jackson进行动态多态类型处理

Java:使用枚举进行动态类型转换

使用Type类进行动态类型转换

使用 decltype 进行动态多态类型推导

使用可视设计器进行动态更新:是否可以将流转换为代码,或者更好?

在Scala中,是否可以实例化通用类型T的对象?

C#LINQ,通过[Key]属性进行动态分组

进行动态编程

使用Rust可以在WebAssembly中进行动态链接吗?

我可以对SQLAlchemy进行动态比较吗?

python解释器是否在进行动态优化?

是否可以动态调用属性?

Typescript 动态联合类型的动态对象属性

在TypeScript中使用字符串文字基于对象属性的动态返回类型