VueJS中的类型引用提供/注入功能
<p>我正在尝试从父组件提供一个类型化的 ref,并将其注入到子组件中。</p>
<p>我不确定是否理解了VueJS文档,但这是我想出来的。</p>
<pre class="brush:php;toolbar:false;">import type { Ref } from 'vue'
import type { InjectionKey } from 'vue'
import type DocumentSet from '@/types/DocumentSet'
const documentSet = Symbol() as InjectionKey<{
documentSet: Ref<DocumentSet>,
update: () => void
}>
export default documentSet</pre>
<p>所以,任务是提供一个类型化的对象(在我的情况下是documentSet),以及一个更新它的函数。</p>
<p>现在,在父组件中我有这样的代码:</p>
<pre class="brush:php;toolbar:false;">import dsKey from '@/injectionKeys/documentSet'
import type DocumentSet from '@/types/DocumentSet'
...
const documentSet = ref<DocumentSet | null>(null)
provide(dsKey, {
documentSet,
update: () => console.log('update')
})</pre>
<p>而在子组件中,我有这样的代码:</p>
<pre class="brush:php;toolbar:false;">import dsKey from '@/injectionKeys/documentSet'
const ds = inject(dsKey)
const documentSet = ds?.documentSet</pre>
<p>问题是,由于有很多样板代码,我觉得自己做错了什么。例如,我无法理解为什么要重构ds对象,像这样:</p>
<pre class="brush:php;toolbar:false;">const { documentSet } = ds</pre>
<p>是否有可能缩短代码,而不是写<code>ds?.documentSet</code>,尤其是如果我确定ds应该存在(没有它,我不会渲染子组件)</p>
<p>如果我这样写<code>const { documentSet } = inject(dsKey)</code>,会出现以下错误:</p>
<p><code>TS2339: 类型“{ documentSet: Ref ;”上不存在属性“documentSet”更新:() => 无效; } |未定义'.</code></p>
<p>这个想法是因为我想消除子组件中的重复:</p>
<pre class="brush:php;toolbar:false;"><DocumentSetInfo
:documentSet="documentSet"
/>
<DocumentSetMemos
:documentSet="documentSet"
/>
<DocumentSetPrograms
:documentSet="documentSet"
/>
<DocumentSetPetition
:documentSet="documentSet"
/>
<DocumentSetPassRequests
:documentSet="documentSet"
/>
<DocumentSetReport
:documentSet="documentSet"
/>
<DocumentSetReceptionNotices
:documentSet="documentSet"
/></pre></p>