Весной стартует сезон найма, успей отхватить свой оффер!

Utility Type Required в TypeScript

Required — это utility тип в TypeScript, который делает все свойства типа обязательными, если они были опциональными. При работе с объектами, где некоторые поля не всегда могут быть заполнены, Required позволяет обеспечить строгую обязательность всех свойств на определённом этапе разработки или в определённом контексте.

Синтаксис

Required<T>
  • T — исходный тип, все свойства которого вы хотите сделать обязательными.

Тип Required превращает каждое свойство T в обязательное, убирая у него вопросительный знак ?. Это особенно полезно, когда после валидации или дополнительной обработки данных вы уверены, что объекты должны содержать все поля.

Когда использовать Required?

  • Если нужно гарантировать, что у объекта будут все свойства.
  • При вынужденном заполнении необязательных полей перед отправкой данных.
  • В функциях, где требуется полный объект, без undefined.

Примеры использования Required

Преобразование опциональных свойств в обязательные:

Предположим, у нас есть интерфейс User с несколькими полями, часть из которых может отсутствовать:

  interface User {
    id: number;
    name: string;
    age?: number;
    address?: string;
  }

  type RequiredUser = Required<User>;

  const user: RequiredUser = {
    id: 1,
    name: "Alice",
    age: 30,
    address: "Wonderland Ave",
  };
  • User — это исходный интерфейс, у которого поля age и address могут быть не заданы.
  • RequiredUser превращает все поля (включая age и address) в обязательные.
  • При попытке пропустить какое-либо из свойств age или address, TypeScript выдаст ошибку, требуя их обязательного указания.

Использование Required для пост-валидации данных:

Часто бывает, что вы сначала описываете данные в виде Partial<User> (или с опциональными полями), собирая их по частям, а затем после валидации хотите получить «полноценную» версию типа, в которой поля гарантированно существуют:

function createUserData(data: Partial<User>): Required<User> {
  // ... Выполняем валидацию и заполняем пропущенные поля
  return {
    id: data.id ?? 0,
    name: data.name ?? "Unknown",
    age: data.age ?? 0,
    address: data.address ?? "Unknown",
  };
}

const partialUser: Partial<User> = { name: "Bob" };
const fullUser: Required<User> = createUserData(partialUser);
// fullUser имеет все обязательные поля (id, name, age, address)

В этой ситуации после выполнения проверки и заполнения значений, Функция возвращает объект типа Required<User>, где все поля теперь обязательны.