簡體   English   中英

如何根據字典的鍵/值創建 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 似乎不起作用,因為它是 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM