簡體   English   中英

如何根據函數參數數組返回類型化對象?

[英]How to return typed object based on function argument array?

我有一個函數將數組值轉換為對象中的鍵:

function x(keys: string[]) {
  const obj: any = {};
  keys.forEach(v => {
    obj[v] = 'somevalue...';
  });
  return obj;
}

const result = x(['a', 'b', 'c']);
console.log(result); // {a: "somevalue...", b: "somevalue...", c: "somevalue..."}

是否有可能告訴TypeScript該函數的返回值為{<values of array>: string}

由於打字稿的打字只能在編譯時使用,因此無法在運行時推斷出這些信息,尤其是 如果數組是動態創建的。 (如果您的按鍵不變,請查看Titian的解決方案 。)

對於typescript,您的數組是一個字符串數組。

您可以使用索引簽名鍵入x函數的返回對象,以避免任何類型提示:

const obj: {[key: string]: string} = {};

但請記住,它不會檢查密鑰的存在。

所以編譯器會認為

const exists = obj["a"];
const doesntExists = obj["junk"];

沒關系。 您仍然需要檢查未定義的值。

如果您的函數主要使用常量調用,則使用泛型類型參數捕獲在泛型類型參數中傳遞給函數的實際字符串是有意義的。 您可以將此類型參數與記錄一起使用以獲取具有您指定的鍵的強類型對象。

function x<K extends string>(keys: readonly K[]) {
  const obj = {} as Record<K, string>;
  keys.forEach(v => {
    obj[v] = 'somevalue...';
  });
  return obj;
}

const result = x(['a', 'b', 'c']); //  Record<"a" | "b" | "c", string>, same as {a: string, b: string, c: string}
result.a;
const keys = ['a', 'b', 'c'] as const
const result2 = x(keys);//  Record<"a" | "b" | "c", string>

const skeys = ['a', 'b', 'c']// string[]
const result3 = x(keys);//  Record<string, string>, same as { [n: string]: string }

如果使用包含string的數組調用該函數,您將獲得一個普通的索引簽名,因此使用此版本時不會更糟。

暫無
暫無

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

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