lodash - Skriv en typesäker 'pick'-funktion i typescript


lodash har funktionen pick som används på följande sätt:

var object = { 'a': 1, 'b': '2', 'c': 3 };
 
_.pick(object, ['a', 'c']);
// => { 'a': 1, 'c': 3 }

Jag skulle vilja skriva en typ-säker version av detta i TypeScript.

Användningen av denna funktion bör vara

pick(object, "a", "b")

Målet är att bevara typsäkerheten.

Är detta möjligt att uppnå?

Svar #1

Det låter som att du kanske letar efter Pick-typen. Skulle något sådant här fungera för dig?

function pick<T, K extends keyof T>(obj: T, ...keys: K[]): Pick<T, K> {
  const ret: any = {};
  keys.forEach(key => {
    ret[key] = obj[key];
  })
  return ret;
}

const o = {a: 1, b: '2', c: 3}
const picked = pick(o, 'b', 'c');

picked.a; // not allowed
picked.b  // string
picked.c  // number

Svar #2

Med Object.fromEntries (es2019):

function pick<T extends object, K extends keyof T> (base: T, ...keys: K[]): Pick<T, K> {
  const entries = keys.map(key => ([key, base[key]]));
  return Object.fromEntries(entries);
}

Relaterade artiklar