簡體   English   中英

使用對象的鍵作為聯合類型

[英]Use keys of an object as union-type

我有一個對象(讓它被凍結,這樣打字稿可以更好地處理它的鍵):

const obj = Object.freeze({
    'hello': 64,
    'world': 20
}) as {[key: string]: number};

現在我有一個功能,用戶可以通過他們的鍵選擇值:

const pick = (keys: Array<string>): Array<number> => {
    const values = [];

    for (const key of keys) {

        // Check if object contains property-key
        if (!(key in obj)) {
            throw new Error(`There's no such key: ${key}`);
        }

        values.push(obj[key]);
    }

    return values;
};

到目前為止看起來不錯,並且在運行時運行時完美無缺,我檢查用戶是否傳遞了任何無效密鑰。 但是我怎么能告訴 TS 只能使用來自obj鍵呢?

我可以做Array<'hello' | 'world'> Array<'hello' | 'world'>但我每次向obj添加新屬性時都需要更新它,這有點煩人。

相關問題,但它們似乎都使用類型,而我只有一個對象(如果有幫助,可以將其凍結):

  1. 從類型鍵創建聯合類型的對象(他有一個類型,我有一個對象)
  2. 獲取按對象值類型過濾的對象鍵的聯合類型(基本上與 1 相同。但他想要該type而我正試圖我的對象中構建一個類型)
  3. 在 TypeScript 中獲取對象聯合的鍵(看起來不錯,但他也有一個類型......)
const obj = Object.freeze({
    'hello': 64,
    'world': 20
});

const pick = (keys: Array<keyof typeof obj>) {...}

如您所見,我已將其刪除as {[key: string]: number}; 因為它正在擴大類型,您希望它嚴格。

接下來是Array<keyof typeof obj>我在這里聲明我只接受來自obj類型的鍵數組作為參數。

Array<keyof typeof obj>動態計算為("hello" | "world")[] ,幸運的是它會反映原始obj每一個變化

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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