Друзья, помогите разобраться! У меня есть функция, которая использует метод filter для обработки массива. Вот как она выглядит:
const обработатьДанные = (список: string[]) => {
const сегодня = new Date();
return список.filter((элемент: string) => {
const начало = new Date(элемент.договоры[0].датаНачала);
const конец = new Date(элемент.договоры[0].датаОкончания);
return начало <= сегодня && сегодня <= конец;
});
};
export default обработатьДанные;
Проблема в том, что TypeScript ругается: свойство ‘договоры’ не существует в типе string. Как мне правильно типизировать эту функцию, чтобы она работала? Может, нужно создать отдельный интерфейс? Буду благодарен за любые советы!
Да, тут интерфейс нужен, но я бы еще добавил дженерик для гибкости. Вот как можно переписать:
interface Договор {
датаНачала: string;
датаОкончания: string;
}
interface Элемент<T> {
договоры: Договор[];
[key: string]: T;
}
function обработатьДанные<T>(список: Элемент<T>[]): Элемент<T>[] {
const сегодня = new Date();
return список.filter(элемент => {
const { датаНачала, датаОкончания } = элемент.договоры[0];
return new Date(датаНачала) <= сегодня && сегодня <= new Date(датаОкончания);
});
}
Так функция станет более универсальной и типобезопасной.
слушай, мне кажется, тут можно пойти другим путем. вместо создания отдельного интерфейса, попробуй использовать тип Record. это позволит тебе гибко описать структуру элементов. вот примерно как это может выглядеть:
type Элемент = Record<string, any> & {
договоры: Array<{ датаНачала: string; датаОкончания: string }>
};
const обработатьДанные = (список: Элемент[]): Элемент[] => {
const сегодня = new Date();
return список.filter(элемент => {
const начало = new Date(элемент.договоры[0].датаНачала);
const конец = new Date(элемент.договоры[0].датаОкончания);
return начало <= сегодня && сегодня <= конец;
});
};
такой подход дает больше гибкости и позволяет избежать лишнего кода. плюс он хорошо подходит, если структура элементов может меняться в будущем.
Да, тут нужен интерфейс. Создай что-то типа:
interface Элемент {
договоры: [{
датаНачала: string,
датаОкончания: string
}]
}
И используй его вместо string в типизации. Тогда TypeScript поймет структуру элементов и перестанет ругаться. Кстати, можешь заодно типизировать и возвращаемое значение функции как Элемент.