首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从只读对象内的嵌套数组/对象中提取可能的字符串值的联合类型

从只读对象内的嵌套数组/对象中提取可能的字符串值的联合类型
EN

Stack Overflow用户
提问于 2022-07-18 11:16:58
回答 1查看 61关注 0票数 -1

如果我在TypeScript中声明了一个只读/不可变对象,如下所示:

代码语言:javascript
复制
const CoupeCar = {
  name: "Coupé",
  specs: {
    primary: [
      {
        name: "engine",
        value: "2.0L",
      },
      {
        name: "transmission",
        value: "6-speed",
      },
      {
        name: "color",
        value: "red",
      },
    ],
  },
} as const;

以及一个函数,用于获取如下所示的嵌套属性:

代码语言:javascript
复制
const getSpecForCoupeCar = (specName: string) => {
  return CoupeCar.specs.primary.find((spec) => spec.name === specName);
}

如果能够严格地键入specName参数,使其不是一个字符串,而是一个联合类型(例如,任意一个"engine" | "transmission" | "color" ),那就太好了。但是,我无法构造这样做的泛型,因为:

  • 我试图编写的大多数泛型都涉及typeof关键字,而实际上,我希望常量的嵌套“值”
  • 嵌套的primary键是一个数组,所以我无法一直访问键名。我找到了一个一般在这里 (type ValuesOf<T extends Readonly<any[]>>= T[number]),但是当它将它们转换成类型时,它遇到了同样的问题,即剥离我想要公开的实际“值”。

在TypeScript中,是否有可能从只读对象中的嵌套数组/对象中“获取”一个联合类型?如果我能够将其表达为一个泛型,那么上面的模式有很多变化,我将从类型安全性中受益。

EN

回答 1

Stack Overflow用户

发布于 2022-07-18 11:54:40

类似于上面@jonrsharpe

代码语言:javascript
复制
type SpecNames = typeof CoupeCar.specs.primary[number]['name'];

const getSpecForCoupeCar = (specName: SpecNames) => {
  return CoupeCar.specs.primary.find((spec) => spec.name === specName);
}

就我个人而言,我会改变数据结构,使之更类似于

代码语言:javascript
复制
specs: {
  primary: {
     engine: {
       ...engine specs
     },
     transmission: {
       ...transmission specs
     },
     color: {
       ...color specs etc (maybe multi panels with different colors - who knows)
     }
  }
}

以防止数组中的欺骗,然后直接从CoupeCar.specs.primary抓取。

如果您需要通过一个函数执行此操作,则类型将变为

代码语言:javascript
复制
type SpecNames = keyof typeof CoupeCar.specs.primary;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73021474

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档