Введите параметры из параметров функции

У меня есть функция omit, которая принимает объект в качестве параметра и список полей, которые нужно опустить, и возвращает объект без указанных свойств.

function omit<T>(instance: T, ...fields: Array<keyof T>) {
  const output: any = {}
  for (const [property, value] of Object.entries(instance)) {
    if ((fields as string[]).includes(property)) continue
    output[property] = value
  }
  return output
}

Я хочу определить тип возвращаемого значения как Omit<T, fields>, где поля определяются аргументами, переданными в функцию. Возможно ли это? Я чувствую, что это может нарушить границу типа/значения, но мне бы хотелось иметь возможность это сделать.


2
69
1

Ответ:

Решено

Существует встроенная утилита типа Omit, вы можете использовать ее:

function omit<T extends object, K extends keyof T>(obj: T, ...fields: K[]): Omit<T, K> {
  const result = { ...obj };
  for (const field of fields) {
    delete result[field];
  }
  return result as Omit<T, K>;
}

// Example usage:
interface Example {
  a: number;
  b: string;
  c: boolean;
}

const example: Example = { a: 1, b: 'test', c: true };
const newObj = omit(example, 'a', 'c'); // newObj will have type { b: string }
console.info(newObj);