In a composition API Vue 3 component, I'm using reactive objects that'll be populated asynchronously with external data.
I'm using "nullable" {} object for that purpose:

import { Ref, ref } from 'vue'
import { Car } from '@mytypes/vehicules'

const car: Ref<Car|{}> = ref({})

fetch('/cars/42').then((result: Car) => {
  car.value = result
}

这样我就可以在模板上显示可能为空的数据

<h1>{{ car.model }}</h1>
<label>Brand</label> {{ car.brand }}
<label>Engine</label> {{ car.engine }}
<label>Color</label> {{ car.color }}

这在我看来就像是一个肮脏的黑客,每次我这样做时,我都面临着一个问题,我需要在每个值传播的地方链接声明Car|{},以保持TypeScrip足够满意.

我想有一种非常合适的方法来做到这一点,不是吗?

推荐答案

我会将引用定义为可为空的:

const car: Ref<Car | null> = ref(null);

然后在我的模板中使用optional chaining operator:

<h1>{{ car?.model }}</h1>

Javascript相关问答推荐

如何修复循环HTML元素附加函数中的问题?

materialized - activeIndex返回-1

TypScript界面中的Infer React子props

Redux查询多个数据库Api reducerPath&

WebRTC关闭navigator. getUserMedia正确

如何在JavaScript文件中使用Json文件

如何在输入元素中附加一个属性为checkbox?

如何在ASP.NET中使用Google Charts API JavaScript将条形图标签显示为绝对值而不是负值

如何通过将实例方法的名称传递给具有正确类型的参数的继承方法来调用实例方法?

MarkLogic-earch.suggest不返回任何值

使用Document.Evaluate() Select 一个包含撇号的HTML元素

将基元传递给THEN处理程序

对具有相似属性的对象数组进行分组,并使用串连的值获得结果

未捕获语法错误:Hello World中的令牌无效或意外

在查看网页时,如何使HTML中的按钮工作方式类似于鼠标上的滚轮或箭头键?

有没有办法更改Chart.js 3.x.x中主要刻度的字体?

select 2-删除js插入的项目将其保留为选项

为什么当雪碧的S在另一个函数中时,Phaser不能加载它?

AstroJS混合模式服务器终结点返回404

错误400:当我试图在React中使用put方法时,该字段是必需的