【问题标题】:Typescript: Define type for multiple dynamic objects of object and append static objects with them打字稿:为对象的多个动态对象定义类型并附加静态对象
【发布时间】:2020-07-08 07:08:52
【问题描述】:

我有一个这样的对象:

{
    mainObject:{
        object1:{
            data1:val,
            data2:val,
            data3:val
        },
        object2:{
            data1:val,
            data2:val,
            data3:val
        },
        object3:{
            data1:val,
            data2:val,
            data3:val
        },
        order:{
            0: object3,
            1: object2,
            2: object1
        },
        positions:{
            prev:{
                data1:val,
                data2:val,
                data3:val
            }
        }
    }
}

需要注意的地方是:

  1. mainObject 是一个对象而不是数组。
  2. 这些键 object1、object2 和 object3 是动态的,它们可以是任何值和任何限制(可以大于或小于 3)。
  3. 键顺序,位置是固定键,它们将始终与数据一起提供。

现在我的问题是:

  1. 我们将如何定义这种结构的类型,其中我们在 object 中有对象并且这些对象的键是动态的。
  2. 我们如何将这 2 个静态对象附加到那些动态设置的对象中。

我已经设置的一些类型是:

interface ObjectVals {
  data1: string;
  data2: string;
  data3: string;
}

interface DynamicKeyVals {
  [key: string]: ObjectVals;
}

我查看了许多答案和文档,但没有得到任何相关的解决方案。有人可以帮我吗?

【问题讨论】:

    标签: typescript typescript-typings typescript-generics


    【解决方案1】:

    您可以尝试以下方法:

    export type OrderType = {
        [T: number]: string
    }
    
    export type PositionType = {
        prev: {
            [T: string]: string
        }
    }
    
    export type CommonObjectType = {
        [T: string]: string
    }
    
    export type MainObjectStatic = {
        order: OrderType
        position: PositionType
    }
    
    export type MainObjectDynamic = {
        [T in string]: CommonObjectType
    }
    
    export type MainObject = MainObjectStatic | MainObjectDynamic
    
    interface Wrapper {
        mainObject: MainObject
    }
    
    const a: Wrapper = {
        mainObject: {
            order: {
                1: "something"
            },
            position: {
                prev: {
                    "data1": "value"
                }
            },
            object1: {
                value1: "value"
            },
            alma: {
                foo: "2"
            }
        },
    
    }
    

    但是您可能会遇到问题 - 它只允许您实现 MainObjectStatic 或 MainObjectDynamic。

    另一方面,如果您更改为export type MainObject = MainObjectStatic | MainObjectDynamic,它将指出positionMainObjectDynamic 之间的类型不兼容

    我认为在同一级别混合静态和动态类型总是有问题的——如果可以的话,你应该重新组织结构

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-24
      • 2018-09-15
      • 2020-07-15
      • 2019-02-11
      • 2022-01-17
      • 1970-01-01
      相关资源
      最近更新 更多