首页 > 解决方案 > 打字稿:为对象的多个动态对象定义类型并附加静态对象

问题描述

我有一个这样的对象:

{
    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. 我们将如何将这两个静态对象附加到那些动态设置的对象中。

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

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

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

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

标签: typescripttypescript-typingstypescript-generics

解决方案


您可以尝试以下方法:

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它会指出和之间的类型不position兼容MainObjectDynamic

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


推荐阅读