首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何根据字典的键/值创建类型?

如何根据字典的键/值创建类型?
EN

Stack Overflow用户
提问于 2022-02-07 19:17:33
回答 1查看 765关注 0票数 0

是否有一种基于字典值自动生成类型的方法?例如,给定这个常量值字典:

代码语言:javascript
复制
export const SHIPMETHODS: OptionsMap<UpsShipMethodOption> = {
    'UPS': 'GND',
    'UPS AIR2': '2DA',
    'UPS 3DAY SELECT': '3DS'
}

有没有一种方法可以自动生成这样的类型,而不必复制所有的东西?

代码语言:javascript
复制
export type ShipMethodOptionMap = {
    'UPS': 'GND',
    'UPS AIR2': '2DA',
    'UPS 3DAY SELECT': '3DS'
}

不幸的是,keyof似乎不起作用,因为它是一个对象,而不是一个类型,因此它不起作用:

代码语言:javascript
复制
export type UpsShipMethodOption = keyof SHIPMETHODS // Doesn't work

我还尝试将映射类型与预先声明的键联合类型一起使用,但它也不起作用:

代码语言:javascript
复制
/* 
  Type 'KeyOptions' is not assignable to type 'string | number | symbol'.
  Type 'KeyOptions' is not assignable to type 'symbol'.ts(2322)
*/
export type OptionsMap<KeyOptions> = {
    readonly [Property in KeyOptions]: string;
}

export const SHIPMETHODS: OptionsMap<UpsShipMethodOption> = {
    'UPS': 'GND',
    'UPS AIR2': '2DA',
    'UPS 3DAY SELECT': '3DS'
}
export type UpsShipMethodOption = 'UPS' | 'UPS AIR2' | 'UPS 3DAY SELECT'

我有一堆这样的字典,其中大多数都很大(30+键)。将字典复制到任何地方都会使维护变得很痛苦,以防值发生变化,因此对此提供任何帮助都是很好的!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-02-07 19:21:57

我想你只是想要typeof接线员。它只获取值的类型。

代码语言:javascript
复制
const SHIPMETHODS = {
    'UPS': 'GND',
    'UPS AIR2': '2DA',
    'UPS 3DAY SELECT': '3DS'
} as const // as const is important.

type ShipMethodOptionMap = typeof SHIPMETHODS 
/*
type ShipMethodOptionMap = {
    readonly UPS: "GND";
    readonly 'UPS AIR2': "2DA";
    readonly 'UPS 3DAY SELECT': "3DS";
}
*/

type UpsShipMethodOption = keyof ShipMethodOptionMap
// type UpsShipMethodOption = "UPS" | "UPS AIR2" | "UPS 3DAY SELECT"

只需注意在你的目标上,它允许类型记录推断字符串文字,这样它们就可以成为类型的一部分。

游乐场

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71024171

复制
相关文章

相似问题

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