API композиции Vue 3 получает значение из ссылки на объект

У меня ref:

const editItem = ref<object | null>(null)

Вот пример его значения:

{
   id: 1,
   title: 'Harry Potter',
   author: 'J.K. Rowling',
   created: '30-08-2000',
}

Если я запускаю console.log(editItem.value), я вижу этот объект:

введите описание изображения здесь

Но когда я пытаюсь прочитать значение author с помощью console.log(editItem.value.author), я вижу эту ошибку:

Object is possibly 'null'.

person michal    schedule 30.10.2020    source источник
comment
не могли бы вы привести пример в codeandbox? вы можете дополнить этот codeandbox.io/s/vue-3-ts-y7bdv   -  person Boussadjra Brahim    schedule 30.10.2020


Ответы (2)


Поскольку тип ссылки - object | null, он может быть null при обращении к нему, что приведет к исключению времени выполнения. Сообщение об ошибке предупреждает о такой возможности для editItem.value.

Вы можете либо добавить null-проверку для его доступа:

if (editItem.value) {
  console.log(editItem.value.author)
}

... или вы можете просто использовать необязательная цепочка:

console.log(editItem.value?.author)

Но вы заметите, что вы получите другое предупреждение о том, что author не является частью подписи для object. Одно из решений - изменить тип ref с object на определенный интерфейс:

interface MyRef {
  id: number;
  title: string;
  author: string;
  created: string;
}

const editItem = ref<MyRef | null>(null)

console.log(editItem.value?.author) ✅
person tony19    schedule 03.11.2020

Чех Михал

Проблема (не видя кода), похоже, заключается в том, что вы используете ref для значения объекта. Хотя вы можете найти обходной путь, чтобы заставить его работать, самый простой способ справиться с реактивными объектами - использовать reactive вместо ref.

Еще одно преимущество заключается в том, что вам не нужно использовать .value при получении или установке значения объекта.

person Daniel    schedule 30.10.2020