文章来源:https://juejin.cn/post/6978035248487464974

在 vue3 的项目当中,有时候需要使用ref 获取到组件的实例对象。 当结合 typescript 使用时就需要进行类型的定义才能访问到实例的成员。
就我目前知道的就有三种方式

  • 自定义类型
  • 使用 InstanceType
  • 通过组件的setup函数自动推断 ```vue // 组件 child.vue

// 使用的页面

  1. <a name="nAD47"></a>
  2. ## 自定义类型
  3. 当然 我们也可以直接定义 child.vue 组件实例的 类型<br />直接在 child.vue 中 定义类型 ChildCtx
  4. ```vue
  5. // 组件 child.vue
  6. <script lang="ts">
  7. // ++ 定义类型
  8. export interface ChildCtx {
  9. num: number;
  10. }
  11. export default defineComponent({
  12. setup(){
  13. const num = ref(0);
  14. return {
  15. num
  16. }
  17. }
  18. })
  19. </script>

在使用的时候

  1. <template>
  2. <child ref="childRef"/>
  3. </template>
  4. <script lang="ts">
  5. import {defineComponent, onMouned } from 'vue'
  6. import {ChildCtx}, Child from './child.vue'
  7. export default defineComponent({
  8. components: {Child},
  9. setup(){
  10. //++ 定义类型
  11. const childRef = ref<null | ChildCtx>(null);
  12. onMouned(() => {
  13. childRef.value?.num; // 这里可以访问到 num 属性
  14. })
  15. }
  16. })
  17. </script>

使用 InstanceType

InstanceType 是 ts 自带的类型, 能够直接获取组件完整的实例类型

  1. <script lang="ts">
  2. import Child from './child.vue'
  3. import {ElImage} from 'element-plus'
  4. type ElImageCtx = InstanceType(typeof ElImage);
  5. type ChildCtx = InstanceType(typeof Child);
  6. setup() {
  7. const child = ref<null | ChildCtx>(null);
  8. const elImgRef = ref<null | ElImageCtx>(null)
  9. onMounted(() => {
  10. child.value?.num ;// 可以直接访问到
  11. elImgRef.value?. // 对于 element组件,可以访问到很多的属性
  12. })
  13. }
  14. </script>