#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]
нотации. 😀