这可能是你能得到的最好的,就像数据属性和方法v3 指南一样:
这些 [data] 实例属性仅在首次创建实例时添加,因此您需要确保它们都存在于 data 函数返回的对象中。如有必要,对所需值尚不可用的属性使用 null、undefined 或其他一些占位符值。
如果你想让定义不那么麻烦,你总是可以定义一个类似opt<T>() => undefined as T | undefined
or的实用程序type Opt<T> = T | undefined
。
data() {
function opt<T>() { return undefined as T | undefined; }
return {
apiData: opt<DataType>(),
foo: opt<Bar>(),
}
},
async mounted() {
this.apiData = await getData()
}
也就是说,如果您愿意添加另一个间接层,您可以Partial<YourData>
在对象中保存的实例上安装可选属性data
。因为Vue 可以代理“深度”嵌套属性访问,这应该让 Vue 有机会对更多属性的添加/删除做出反应,而无需预先定义它们。
interface OptionalData {
prop1: string;
prop2: number;
apiData: DataType;
}
data() {
return {
optionalData: {} as Partial<OptionalData>
}
},
async mounted() {
this.optionalData.apiData = await getData()
}
当然,如果您必须对许多可选字段的存在或不存在做出反应,您的组件可能会变得难以理解。如果你发现你经常需要这种模式,它可能表明你有机会将你的组件重构为多个更小的组件,或者创建一个更丰富的模型对象来抽象出一些复杂性。