Typescript Выбирает и (keyof TEntity)[], пытаясь создать функцию setFields

#typescript

#машинописный текст

Вопрос:

Я пытаюсь создать функцию setFields в TypeScript, это просто сопоставитель с частичным классом, я хочу вернуть тип утилиты выбора, связывая два типа ввода, я пытался это сделать:

 setFields<TEntity, TFields extends (keyof TEntity)[]>(array: TEntity[], fields: TFields): Pick<TEntity, TFields>[] {
  return array.map(x => {
    let result: any = {};
    for (const field of fields)
      result[field] = x[field];
    return resu<
  });
};

 

Но, конечно, это не работает, потому что класс Pick ожидает a keyof TEntity , а не an Array<keyof TEntity>

 Type 'TFields' does not satisfy the constraint 'keyof TEntity'.
  Type '(keyof TEntity)[]' is not assignable to type 'keyof TEntity'.
 

Мой ожидаемый ввод / вывод:

 setFields([
  { id: 'id1', name: 'name1', phone: 'phone1' },
  { id: 'id2', name: 'name2', phone: 'phone2' },
  { id: 'id3', name: 'name3', phone: 'phone3' }
], ['id', 'name']);

// [
//   { id: 'id1', name: 'name1' },
//   { id: 'id2', name: 'name2' },
//   { id: 'id3', name: 'name3' }
// ]
 

Как я могу решить эту проблему?

Комментарии:

1. Пожалуйста, поделитесь интерфейсом IEntity и IFields или ожидаемым типом

Ответ №1:

Я предполагаю, что вы ищете что-то вроде этого:

 
function setFields<TEntity, TFields extends (keyof TEntity)[]>(array: readonly TEntity[], fields: TFields) {
// I used reduce to avoid mutation and to be more functional
  return array.map(x => fields.reduce((acc, field) => {
    return {
      ...acc,
      [field]: x[field]
    }

  }, {} as Pick<TEntity, TFields[number]>));
};


const result = setFields([{ age: 1, name: 'john' }], ['age']) // Pick<{ age: 1, name: 'john' },'age'>[]
 

Чтобы получить все значения массива, вы должны использовать TFields[number] вместо keyof оператора.

Комментарии:

1. Спасибо, я не знал о [number] нотации. 😀