Typescript пустой объект для типизированной переменной
Скажем, у меня есть:
type User = {
...
}
Я хочу создать новый user
, но установить его как пустой объект:
const user: User = {}; // This fails saying property XX is missing
const user: User = {} as any; // This works but I don't want to use any
Как мне это сделать? Я не хочу, чтобы переменная была null
.
Ответы
Ответ 1
Предостережения
Вот два достойных предостережения от комментариев.
Либо вы хотите, чтобы пользователь был типа User | {}
User | {}
или Partial<User>
, или вам нужно переопределить тип User
чтобы разрешить пустой объект. Сейчас компилятор правильно говорит вам, что пользователь не является пользователем. - jcalz
Я не думаю, что это следует считать правильным ответом, потому что это создает несовместимый экземпляр типа, подрывая всю цель TypeScript. В этом примере свойство Username
остается неопределенным, а аннотация типа говорит, что его нельзя определить. - Ian Liu Rodrigues
Ответ
Одна из целей разработки TypeScript - "найти баланс между правильностью и производительностью". Поэтому, если это будет полезно для вас, используйте утверждения типа для создания пустых объектов для типизированных переменных.
type User = {
Username: string;
Email: string;
}
const user01 = {} as User;
const user02 = <User>{};
user01.Email = "[email protected]";
Вот {};
user01.Email = "[email protected]"; rel="nofollow noreferrer">рабочий пример для вас.
![Here are type assertions working with suggestion.]()
Ответ 2
Действительно зависит от того, что вы пытаетесь сделать. Типы - это документация в typescript, поэтому вы хотите показать намерение о том, как эта вещь должна использоваться при создании типа.
Вариант 1: если у пользователей могут быть некоторые, но не все атрибуты в течение их жизни
Сделать все атрибуты необязательными
type User = {
attr0?: number
attr1?: string
}
Вариант 2: Если переменные, содержащие пользователей, могут начинаться с нуля
type User = {
...
}
let u1: User = null;
Хотя, действительно, здесь, если точкой является объявление объекта User, прежде чем можно будет узнать, что ему будет присвоено, вы, вероятно, захотите сделать let u1:User
без какого-либо назначения.
Вариант 3: Что вы, вероятно, хотите
Действительно, предпосылка typescript заключается в том, чтобы убедиться, что вы согласны с ментальной моделью, которую вы описываете в типах, чтобы избежать ошибок. Если вы хотите добавить вещи к объекту один за другим, это привычка, которую typescript пытается заставить вас не делать.
Скорее всего, вы хотите сделать некоторые локальные переменные, а затем назначьте переменную, содержащую пользователь, когда она будет готова к полнофункциональному пользователю. Таким образом, вы никогда не останетесь с частично сформированным пользователем. Эти вещи грубые.
let attr1: number = ...
let attr2: string = ...
let user1: User = {
attr1: attr1,
attr2: attr2
}