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
}