Typescript не разрешает инициализацию пустого объекта - PullRequest
0 голосов
/ 13 апреля 2020

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

const body: {
    "name": string,
    "photo": {
        "fileName": string,
        "file": NodeJS.ReadableStream,
        "encoding": string,
        "mimetype": string,
        "sizeInBytes": number,
        "publicUrl": string
    },
    "token": string
} = null;

, но позже, когда я получаю данные и пытаюсь поместить данные следующим образом:

body[someVariable] = someVariable;

он переносится без ошибок, но когда я запускаю файл js, он выдает мне ошибку, подобную этой:

Uncaught TypeError: Cannot set property 'fieldName1' of undefined

Я искал по inte rnet и обнаружил, что объект должен быть инициализируется как {} пустой объект для дальнейшего добавления свойств в него, но если я сделаю что-то подобное, например: body = {} ays значения ошибки машинописного текста отсутствуют, я не в состоянии сделать эти значения необязательными

1 Ответ

0 голосов
/ 13 апреля 2020

У вашего вопроса есть две стороны.

Прежде всего, вы не можете назначить свойства нулевого или неопределенного объекта. Другими словами, если ваша переменная инициализирована как null, вы не можете получить доступ к одному из его свойств и присвоить ему значение. Это ошибка JavaScript.

Затем следует ошибка TypeScript. Похоже, вы хотите объявить необязательные свойства для вашего объекта. Вы можете сделать это с помощью оператора ?:

const body: {
  name?: string,
  photo?: {
    fileName?: string,
    file?: NodeJS.ReadableStream,
    encoding?: string,
    mimetype?: string,
    sizeInBytes?: number,
    publicUrl?: string
  },
  token?: string
} = null;

или с помощью Partial generi c типа:

interface BodyType {
  name: string,
  photo: {
    fileName: string,
    file: NodeJS.ReadableStream,
    encoding: string,
    mimetype: string,
    sizeInBytes: number,
    publicUrl: string
  },
  token: string
}

const body: Partial<BodyType> = {};

Для получения дополнительной информации о Partial generi c, посмотрите здесь здесь .

Таким образом, вы сможете указать тип вашего объекта, не заполняя каждое объявленное свойство при инициализации. В идеале вы не должны использовать Partial, за исключением определенных случаев c, а вместо этого объявлять, какие свойства являются необязательными, а какие - обязательными для интерфейса.

В любом случае это зависит от того, какие у вас типы жадный. Имеет ли смысл иметь интерфейс BodyType со всеми обязательными реквизитами? Затем go для подхода Partial. Вы знаете заранее, какие свойства могут быть неопределенными, а какие нет? Затем используйте оператор ?.

...