[英]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 似乎不起作用,因為它是 object 而不是類型,所以這不起作用:
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"
只需注意object 上的as const
,它允許 typescript 推斷字符串文字,以便它們成為類型的一部分。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.