Как я могу сделать одно свойство необязательным в типе машинописи?

#typescript

Вопрос:

У меня есть такой тип:

 type User = { 
  id: string;
  name?: string;
  email?: string;
}
 

И я хотел бы создать аналогичный тип с name необязательными:

 type UserWithName = {
  id: string;
  name: string;
  email?: string;
}
 

Вместо того, чтобы повторять тип, как я делал выше, как я могу создавать UserWithName из User общих полезных типов?
Обязательное почти выполняет свою работу, но оно устанавливает все свойства как необязательные, в то время как я просто хочу установить одно свойство.

Ответ №1:

Если вы проверите источник на наличие Required типа, это будет так:

 type Required<T> = {
  [P in keyof T]-?: T[P]
}
 

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

 type User = {
  id: string
  name?: string
  email?: string
}

type WithRequired<T, K extends keyof T> = T amp; { [P in K]-?: T[P] }

type UserWithName = WithRequired<User, 'name'>

// error: missing name
const user: UserWithName = {
  id: '12345',
}
 

Ссылка на игровую площадку

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

1. Это именно то, что я искал, спасибо!

Ответ №2:

Вместо этого вы можете использовать интерфейсы:

 interface User  { 
  id: string;
  name?: string;
  email?: string;
}


interface UserWithName extends User {
  name: string;
}
 

Теперь вы построили User тип, но перезаписали name свойство, чтобы оно было обязательным. Проверьте эту игровую площадку с машинописным текстом — UserWithName при отсутствии свойства name произойдет ошибка.

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

1. Спасибо вам за ваш ответ! Это интересная альтернатива, но я искал метод, использующий универсальный тип утилиты, потому что на самом деле я не хочу объявлять другой функциональный тип, если это имеет смысл.