【问题标题】:Create Dynamic Record Type in TypeScript based on Key value基于 Key 值在 TypeScript 中创建动态记录类型
【发布时间】:2021-02-26 22:08:41
【问题描述】:

目前我的应用程序上确实有以下接口。是否可以根据键值创建记录类型PropA。 例如:如果我将"apple" 作为记录键传递,它将期望IApple 接口的值,否则它将期望IModel

interface Itest {
  propsA: Record<string,IModel>
}

【问题讨论】:

  • 您必须在代码type Map = { apple: IApple; model: IModel } 的某处将名称映射到类型。你有吗?
  • 我可以添加那个映射,你能详细说明我如何使用这个映射吗?
  • 当你说“通过“苹果”作为记录键”你是什么意思?你的意思是你希望它是通用的,比如Itest&lt;"apple"&gt;propsA: Record&lt;string, IApple&gt;?或者你的意思是propsA 本身就是一个像{ apple: IApple; model: IModel } 这样的对象?在第二种情况下,您根本不需要 Record 类型。就像上一条评论一样,它只是 interface Itest { propsA: Map }Map
  • propsA: Record -> 如果 {string} 值为“apple”,IModel 应该是 IApple 的类型,否则 IModel。
  • IAppleIModel 的子类型还是完全不同?如果它们不同,那就很难了。如果它是一个子类型就简单了。

标签: typescript


【解决方案1】:

您需要一个对象类型,其中所有string 键的值都为IModel 除了"apple" 的值IApple

如果IAppleIModel 的子类型,那么这很简单。 Record&lt;string, IModel&gt; 声明所有属性都必须是 IModel。我们将它与&amp; {apple?: IApple} 结合起来,表示属性apple 也必须是IApple? 表示apple 是可选的。

interface Itest {
  propsA: Record<string, IModel> & {apple?: IApple}
}

Playground Link

如果IAppleIModel 是两个不相关的类型,那么这将变得更加棘手,因为Record&lt;string, IModel&gt; 适用于包括apple 在内的每个string,并且我们得到一个错误“属性'apple' 与索引签名不兼容。 "我们需要说除了apple之外的每个键的值都是IModel

【讨论】:

    猜你喜欢
    • 2022-01-16
    • 2021-09-06
    • 2016-12-30
    • 1970-01-01
    • 2021-12-31
    • 1970-01-01
    • 1970-01-01
    • 2019-10-23
    • 1970-01-01
    相关资源
    最近更新 更多