TS中inject type unknown的问题

文章讲述了在Vue应用中,使用<scriptsetup>语法糖结合typescript时,遇到通过provide传递的reload函数在子组件中注入后出现类型错误的问题。解决方案包括检查类型、提供默认值以及使用InjectionKey来精确定义类型,从而避免类型推断错误。
摘要由CSDN通过智能技术生成

描述

App.vue
<script setup lang="ts">
import { provide, ref, nextTick } from 'vue'
const isRouterAlive = ref<boolean>(true)
const reload = () => {
  isRouterAlive.value = false
  nextTick(() => {
    isRouterAlive.value = true
  })
}
provide('reload', reload)
</script>

OtherComponent.vue
<script setup lang="ts">
import { reactive, inject } from 'vue'
const reload = inject('reload')
const fun1 = () => {
  reload()
}
</script>

此时TS会报错:'reload' is of type 'unknown'.

解决方案

  1. 判断类型
if (typeof reload === 'function') {
  reload()
}
  1. 给定初始值
const reload = inject('reload', () => {})
const reload = inject('reload') as () => {}
3. InjectionKey
function provide<T>(key: InjectionKey<T> | string | number, value: T): void
function inject<T>(key: InjectionKey<T> | string): T | undefined
function inject<T>(key: InjectionKey<T> | string, defaultValue: T, treatDefaultAsFactory?: false): T
function inject<T>(key: InjectionKey<T> | string, defaultValue: T | (() => T), treatDefaultAsFactory: true): T
types.ts
import type { InjectionKey } from 'vue'
export const reloadInjectKey: InjectionKey<() => {}> = Symbol('reload')

App.vue
import { reloadInjectKey } from '@/utils/types'
provide(reloadInjectKey, reload)

OtherComponent.vue
import { reloadInjectKey } from '@/utils/types'
const reload = inject(reloadInjectKey)
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值