Search code examples
typescriptlodash

Write a typesafe 'pick' function in typescript


lodash has the pick function which is used as follows:

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

I would like to write a type-safe version of this in typescript.

Usage of this function should be

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

The goal is to conserve type safety.

Is this possible to achieve?


Solution

  • Sounds like you might be looking for the Pick type. Would something like this work for you?

    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