Скажем, у меня есть:
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
.
javascript
typescript
Коуша
источник
источник
user
иметь тип,User | {}
либоPartial<User>
, либо вам нужно переопределитьUser
тип, чтобы разрешить пустой объект. Прямо сейчас компилятор правильно сообщает вам, чтоuser
это не файлUser
.Ответы:
Предостережения
Вот две достойные оговорки из комментариев.
Ответ
Одна из целей дизайна TypeScript - «найти баланс между правильностью и производительностью». Если это будет продуктивно для вас, используйте утверждения типа, чтобы создать пустые объекты для типизированных переменных.
type User = { Username: string; Email: string; } const user01 = {} as User; const user02 = <User>{}; user01.Email = "foo@bar.com";
Вот вам рабочий пример .
источник
Username
оставлено неопределенным, а в аннотации типа указано, что оно не может быть неопределенным.На самом деле зависит от того, что вы пытаетесь сделать. Типы - это документация в машинописном тексте, поэтому вы хотите показать намерение о том, как эта вещь должна использоваться при создании типа.
Вариант 1. Если у пользователей могут быть некоторые, но не все атрибуты в течение их жизни
Сделайте все атрибуты необязательными
Вариант 2. Если переменные, содержащие пользователей, могут начинаться с нуля
type User = { ... } let u1: User = null;
Хотя на самом деле здесь, если цель состоит в том, чтобы объявить объект User до того, как станет известно, что ему будет назначено, вы, вероятно, захотите обойтись
let u1:User
без какого-либо назначения.Вариант 3: что вы, вероятно, захотите
На самом деле предпосылка машинописного текста - убедиться, что вы соответствуете ментальной модели, которую вы обрисовываете в типах, чтобы избежать ошибок. Если вы хотите добавлять элементы к объекту по одному, это привычка, которую TypeScript пытается заставить вас не делать.
Скорее всего, вы захотите создать несколько локальных переменных, а затем назначить их переменной, содержащей пользователя, когда она будет готова стать полноценным пользователем. Таким образом, вы никогда не останетесь с частично сформированным пользователем. Эти вещи отвратительны.
let attr1: number = ... let attr2: string = ... let user1: User = { attr1: attr1, attr2: attr2 }
источник
вы можете сделать это, как показано ниже в машинописном тексте
const _params = {} as any; _params.name ='nazeh abel'
поскольку typescript не ведет себя как javascript, поэтому мы должны сделать тип таким же, как и любой, иначе он не позволит вам динамически назначать свойство объекту
источник
Обратите внимание, что использование
const user = {} as UserType
просто обеспечивает intellisense, но во время выполненияuser
является пустым объектом{}
и не имеет свойства внутри. это значитuser.Email
дастundefined
вместо""
type UserType = { Username: string; Email: string; }
Итак, используйте
class
withconstructor
для фактического создания объектов со свойствами по умолчанию.type UserType = { Username: string; Email: string; }; class User implements UserType { constructor() { this.Username = ""; this.Email = ""; } Username: string; Email: string; } const myUser = new User(); console.log(myUser); // output: {Username: "", Email: ""} console.log("val: "+myUser.Email); // output: ""
Вы также можете использовать
interface
вместоtype
interface UserType { Username: string; Email: string; };
... и остальной код остается прежним.
Фактически, вы даже можете пропустить эту
constructor
часть и использовать ее так:class User implements UserType { Username = ""; // will be added to new obj Email: string; // will not be added } const myUser = new User(); console.log(myUser); // output: {Username: ""}
источник
Если вы объявляете литерал пустого объекта, а затем назначаете значения позже, вы можете считать эти значения необязательными (могут или не могут быть там), поэтому просто введите их как необязательные с вопросительным знаком:
источник