【问题标题】:How can I change the type of Object.fromEntries?如何更改 Object.fromEntries 的类型?
【发布时间】:2021-05-16 07:20:25
【问题描述】:

我想将创建 fromEntries 的对象的类型更改为 Program 接口:

interface exerciseCategory {
  [exerciseCategories: string]: string[];
}

interface muscleGroup {
  [muscleGroups: string]: exerciseCategory;
}

export default interface Program {
  [days: string]: muscleGroup;
}

const program: Program = {
  "Day 1": {
    Chest: {
      warmUp: ["parallel bar dips"],
      main: ["Bench Press", "Inclined Bench press", "Decline Bench press"],
      secondary: ["Dumbbell Flys", "Cable Crossover Flys", "Pec-deck Fly"],
    },
    Biceps: {
      Lola: ["Barbell Curl", "Preacher Curl"],
      bobo: ["Hammer Curls", "Cable Curl", "Dumbbell Curl"],
    },
  },
  "Day 2": {
    Shoulders: {
      coso: ["parallel bar dips"],
      coque: ["Bench Press", "Inclined Bench press", "Decline Bench press"],
      sdary: ["Dumbbell Flys", "Cable Crossover Flys", "Pec-deck Fly"],
    },
    Abs: {
      main: ["Crunch", "Leg raises"],
    },
  },
  "Day 3": {
    Back: {
      warmUp: ["parallel bar dips"],
      main: ["Bench Press", "Inclined Bench press", "Decline Bench press"],
      secondary: ["Dumbbell Flys", "Cable Crossover Flys", "Pec-deck Fly"],
    },
    Triceps: {
      main: ["Barbell Curl", "Preacher Curl"],
      secondary: ["Hammer Curls", "Cable Curl", "Dumbbell Curl"],
    },
  },
};



const days: Array<[string, object]> = Object.entries(program);

days[0][0] = 'New day name'

const newProgram:Program = Object.fromEntries(days)

但是对于 const newProgram:Program = Object.fromEntries(days) 我得到: 输入 '{ [k: string]: object; }' 不可分配给类型“程序”。 索引签名不兼容。 “object”类型不能分配给“muscleGroup”类型。 类型“{}”中缺少索引签名

我怎样才能让它工作?

Playground

【问题讨论】:

    标签: typescript


    【解决方案1】:

    在大多数情况下,您可以删除类型并让 TypeScript 推断它们。在您的情况下,您可以删除 days - Array&lt;[string, object]&gt; 的类型。 TS 会从 programObject.entries 类型声明中推断出它们。

    const days = Object.entries(program);
    
    days[0][0] = 'New day name'
    
    const newProgram:Program = Object.fromEntries(days)
    

    playground 中有工作代码

    【讨论】:

      【解决方案2】:

      在 TypeScript 中,通过 Object.entries()Object.fromEntries() 的往返通常会丢失有关特定键及其值类型之间关系的信息,您需要在某处使用 type assertion 来保存或重新建立此类信息。

      但是,在您的情况下,Program 没有特定的已知密钥;它有一个string index signature,因此每个可能的字符串键都有一个muscleGroup 类型的潜在值。因此,Object.entries()Object.fromEntries() 将按原样正常工作,除非你妨碍他们

      由于某种原因,您将days 注释为Array&lt;[string, object]&gt; 类型,将值类型从muscleGroup 扩大到object。这会丢弃信息。你最好让编译器推断days的类型:

      const days = Object.entries(program);
      //  [string, muscleGroup][]
      

      然后一切都会按预期进行:

      const newProgram: Program = Object.fromEntries(days); // okay
      

      Playground link to code

      【讨论】:

      • 是的,我只是将 days 类型更改为 Array 并且它起作用了。
      猜你喜欢
      • 2021-07-19
      • 1970-01-01
      • 2012-08-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多