【问题标题】:Converting value of interface in Typescript在 Typescript 中转换接口的值
【发布时间】:2021-09-16 09:59:39
【问题描述】:

给定一个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"
      }
    ]
  }
}

【问题讨论】:

    标签: typescript typescript-generics


    【解决方案1】:

    您可以使用以下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>>;
    

    【讨论】:

      猜你喜欢
      • 2016-08-17
      • 2018-10-27
      • 2017-10-09
      • 2021-01-17
      • 2021-01-30
      • 2017-04-25
      • 2020-06-07
      • 1970-01-01
      相关资源
      最近更新 更多