#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. Спасибо вам за ваш ответ! Это интересная альтернатива, но я искал метод, использующий универсальный тип утилиты, потому что на самом деле я не хочу объявлять другой функциональный тип, если это имеет смысл.