如何根据字典的 keys/values 创建 Typescript 类型?
How to create a Typescript type based on the keys/values of a dictionary?
有没有办法根据字典值自动生成类型?例如。给定这个常量值字典:
export const SHIPMETHODS: OptionsMap<UpsShipMethodOption> = {
'UPS': 'GND',
'UPS AIR2': '2DA',
'UPS 3DAY SELECT': '3DS'
}
有没有办法自动生成这样的类型,而不必复制所有内容?
export type ShipMethodOptionMap = {
'UPS': 'GND',
'UPS AIR2': '2DA',
'UPS 3DAY SELECT': '3DS'
}
不幸的是,keyof 似乎不起作用,因为它是一个对象而不是类型,所以这不起作用:
export type UpsShipMethodOption = keyof SHIPMETHODS // Doesn't work
我也尝试过将映射类型与键的预声明联合类型一起使用,但它也不起作用:
/*
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+键)。将字典复制到任何地方的类型会使维护起来很痛苦,以防值发生变化,所以任何帮助都会很棒!
我认为您只需要 typeof
运算符。它只是获取值的类型。
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"
请注意 ,它允许打字稿推断字符串文字,因此它们可以成为类型的一部分。
有没有办法根据字典值自动生成类型?例如。给定这个常量值字典:
export const SHIPMETHODS: OptionsMap<UpsShipMethodOption> = {
'UPS': 'GND',
'UPS AIR2': '2DA',
'UPS 3DAY SELECT': '3DS'
}
有没有办法自动生成这样的类型,而不必复制所有内容?
export type ShipMethodOptionMap = {
'UPS': 'GND',
'UPS AIR2': '2DA',
'UPS 3DAY SELECT': '3DS'
}
不幸的是,keyof 似乎不起作用,因为它是一个对象而不是类型,所以这不起作用:
export type UpsShipMethodOption = keyof SHIPMETHODS // Doesn't work
我也尝试过将映射类型与键的预声明联合类型一起使用,但它也不起作用:
/*
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+键)。将字典复制到任何地方的类型会使维护起来很痛苦,以防值发生变化,所以任何帮助都会很棒!
我认为您只需要 typeof
运算符。它只是获取值的类型。
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"
请注意