簡體   English   中英

TypeScript 通用 function 重載和/或類型保護

[英]TypeScript generic function overloading and/or type guard

我正在嘗試使用通用 function 以這種方式提取枚舉和對象的鍵和值:

type Key = string | number | symbol;
type Dictionary<K extends Key, T> = Partial<Record<K, T>>;
type Obj = Dictionary<Key, unknown>; // stricter than object
type Enum = Dictionary<number, string>; // stricter than enum

function keys<K extends Key, T>(record: Record<K, T>): Array<K> {
  return Object.keys(record) as Array<K>;
}

function values<K extends Key, T>(record: Record<K, T>): Array<T> {
  return keys(record).map((key) => record[key]);
}

問題是 Object.keys(anything) 返回 string[] 無論任何東西的鍵是什么,更糟糕的是,當任何東西是枚舉時,它也返回數值作為字符串(恕我直言,這顯然是錯誤的),所以我寫了這個案例的特定 function:

function keys(record: Enum): Array<number> {
  return Object.keys(record)
    .map((x) => parseInt(x))
    .filter((x) => !isNaN(x));
}

現在如何將此代碼合並到通用密鑰 function 中? 在 K 上有一個類型保護,以防它是我猜的數字,但我嘗試了很多方法都沒有成功......

順便說一句,是否有一個“純 TypeScript”庫已經做到了這一點?

這不直觀 - 但從 Object.keys 假設 keyof T 實際上是不正確的 - 請參閱https://stackoverflow.com/a/55012175/2310450以獲得完整解釋 - 但 TLDR 是要記住 TS 不執行 object 多余的財產檢查和潛在的運行時原型污染。

如果我正確理解你的問題 - 我相信你可以在你的過濾器語句中使用 Extract<keyof T, number> 從 Enum 中提取數字鍵。


function keys<E extends Enum>(record: E): Extract<keyof E, number>[] {
  return Object.keys(record)
    .map((x) => parseInt(x))
    .filter((x): x is Extract<keyof E, number> => !isNaN(x));
}

const res = keys(foo); // res: (0 | 1 | 124124)[]

暫無
暫無

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

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