Skip to content

声明 ref 获取到的组件实例类型

​ 有时候自己定义的组件,在使用时,通过 ref 想要获取到组件实例读取组件暴露出来的属性,但是想要定义组件实例的类型却不知道无从下手,就会导致 ts 推论错误。

​ 其实组件实例的属性和你 defineExpose 时传入的参数是一样的,你暴露出了那些属性,在通过 ref 获取到组件实例时,组件实例上的属性和 defineExpose 传入的参数是一致的。

​ defineExpose 也可以传入泛型达到编译时声明暴露的成员,所以只需要定义需要暴露的 API 的类型即可实现定义组件实例的类型。在外部使用时,引入该类型即可完成对 ref 类型的声明。

例如

定义

提前声明组件暴露出去的 API 类型

ts
export interface CompInst {
  reset: () => void;
}
export interface CompInst {
  reset: () => void;
}

defineExpose 使用

vue
<script setup lang="ts">
import { CompInst } from "vue";

defineExpose<CompInst>({
  reset() {
    console.log("ok");
  },
});
</script>
<script setup lang="ts">
import { CompInst } from "vue";

defineExpose<CompInst>({
  reset() {
    console.log("ok");
  },
});
</script>

使用该组件

vue
<script setup lang="ts">
import { ref } from "vue";
import type { CompInst } from "..";

const compInst = ref<CompInst | null>(null);
</script>

<template>
  <comp ref="compInst" />
</template>
<script setup lang="ts">
import { ref } from "vue";
import type { CompInst } from "..";

const compInst = ref<CompInst | null>(null);
</script>

<template>
  <comp ref="compInst" />
</template>