在 Typescript

时间:2021-07-05 16:14:36

标签: typescript typescript-generics

给定 Person 的接口,我想在此基础上创建一个新的接口 HasmapOfPersonsOverTime。我将推送 Person 对象的更新(即,如果一个人有生日,我会将新的年龄数字以及该人庆祝生日的时间作为对象推送到 age 属性的数组中)。

... 象征其余的属性

interface Person {
    age:number;
    name:string;
    ...
}

我想要一个看起来像这样的界面:

interface HasmapOfPersonsOverTime {
  [id:string]:{
    age:[
          {
            age:number
            time:string
          }
        ]
    },
    name:[
          {
            name:string
            time:string
          }
        ]
    },
    ...
}

并举例说明我想如何使用它:

const list:HasmapOfPersonsOverTime = {
  "1515":{ 
    age:[
      {
        age:24,
        time:"2020-03-05T21:53:37"
      },
      {
        age:25,
        time:"2021-03-05T18:22:05"
      }
    ],
    name:[
      {
        name:"bar",
        time:"1996-03-05T21:53:37"
      }
    ],
    ...
  }
}

我已经走了这么远,但我无法获得属性的类型安全。我创建“值”:字符串,我想要正确的人属性。

interface Person {
  age:number;
  name:string;
}
type HasmapOfPersonsOverTime <T extends Object> = Record<string,Record<keyof T, {'value':string,'time':string}[]>>

const list: HasmapOfPersonsOverTime<Person> = {
  "1515":{ 
    age:[
      {
        value:"24",
        time:"2020-03-05T21:53:37"
      },
      {
        value:"25",
        time:"2021-03-05T18:22:05"
      }
    ],
    name:[
      {
        value:"name",
        time:"1996-03-05T21:53:37"
      }
    ]
  }
}

1 个答案:

答案 0 :(得分:2)

您可以使用以下 mapped type,也可以与其他内置类型一起使用,例如 Pick

type Person = {
  age: number;
  name: string;
};

type OverTime<T> = {
  [K in keyof T]: (Pick<T, K> & { time: string })[];
};

type HashmapOfPersonOverTime = Record<string, OverTime<Person>>;