如果我在TypeScript中声明了一个只读/不可变对象,如下所示:
const CoupeCar = {
name: "Coupé",
specs: {
primary: [
{
name: "engine",
value: "2.0L",
},
{
name: "transmission",
value: "6-speed",
},
{
name: "color",
value: "red",
},
],
},
} as const;以及一个函数,用于获取如下所示的嵌套属性:
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中,是否有可能从只读对象中的嵌套数组/对象中“获取”一个联合类型?如果我能够将其表达为一个泛型,那么上面的模式有很多变化,我将从类型安全性中受益。
发布于 2022-07-18 11:54:40
类似于上面@jonrsharpe
type SpecNames = typeof CoupeCar.specs.primary[number]['name'];
const getSpecForCoupeCar = (specName: SpecNames) => {
return CoupeCar.specs.primary.find((spec) => spec.name === specName);
}就我个人而言,我会改变数据结构,使之更类似于
specs: {
primary: {
engine: {
...engine specs
},
transmission: {
...transmission specs
},
color: {
...color specs etc (maybe multi panels with different colors - who knows)
}
}
}以防止数组中的欺骗,然后直接从CoupeCar.specs.primary抓取。
如果您需要通过一个函数执行此操作,则类型将变为
type SpecNames = keyof typeof CoupeCar.specs.primary;https://stackoverflow.com/questions/73021474
复制相似问题