Vue中TypeScript的常用标注类型(四)模板引用的标注类型

542 阅读1分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第10天,点击查看活动详情

模板引用的标注类型

用过模板引用的朋友应该知道,想要通过组合API的形式获得,必须要要声明一个同名的ref:

<script setup>
import { ref, onMounted } from 'vue'

// 声明一个 ref 来存放该元素的引用
// 必须和模板里的 ref 同名
const input = ref(null)

onMounted(() => {
  input.value.focus()
})
</script>

<template>
  <input ref="input" />
</template>

而想要在TS中正确应用的话,则必须要显示声明泛型参数和一个初始值为null的类型:

<script setup lang="ts">
import { ref, onMounted } from 'vue'

const el = ref<HTMLInputElement | null>(null)

onMounted(() => {
  el.value?.focus()
})
</script>

<template>
  <input ref="el" />
</template>

因为在组件在挂载之前和卸载后的ref都是null,所以要声明和 null 的联合类型,相应的在访问的时候也要通过可选链或者类型守卫的形式。

组件模板引用的标注类型

而还有一种很常见的场景是,我们需要为一个组件添加模板引用,并调用它暴露出的方法。就拿最常见的模态框组件来说吧,你想通过它暴露出的方法来打开它:

<!-- selfModal.vue -->
<script setup lang="ts">
import { ref } from 'vue'

const isShow = ref(false)
const handleOpen = () => (isShow.value = true)

defineExpose({
  handleOpen
})
</script>

当我们想要获得该组件的模板引用时,首先要通过typeof 得到其的类型,并且使用TypeScript其内置的InstanceType工具类型来获取该组件的类型实例:

<!-- App.vue -->
<script setup lang="ts">
import selfModal from './selfModal.vue'

const selfModal = ref<InstanceType<typeof selfModal> | null>(null)

const openModal = () => {
  selfModal.value?.open()
}
</script>

同样的你也要声明一个和null的联合类型的泛型参数,并在访问的时候通过可选链或者类型守卫的形式。

还有一点要注意的是,该种方法只适用于Vue SFC中使用。

好,今天就到这里了。Bye!!!