1. <a-select
  2. :ref="(el) => (listItem.attributeTypeRef = el)"
  3. v-model:value="modelData[listIndex].bindAttributeTypeSelected"
  4. option-label-prop="label"
  5. :disabled="listItem.attributeTypeDisabled"
  6. :loading="listItem.attributeTypeLoading"
  7. :placeholder="$t('message.selection')"
  8. @select="selectAttributeType(listIndex)"
  9. @change="changeAttributeType"
  10. @focus="setRowIndex(listIndex)"
  11. style="width: 150px"
  12. >

TS类型标注

为 dom 模板引用标注类型

模板 ref 需要通过一个显式指定的泛型参数和一个初始值 null 来创建

  1. <script setup lang="ts">
  2. import { ref, onMounted } from 'vue'
  3. const el = ref<HTMLInputElement | null>(null)
  4. onMounted(() => {
  5. el.value?.focus()
  6. })
  7. </script>
  8. <template>
  9. <input ref="el" />
  10. </template>

注意为了严格的类型安全,有必要在访问 el.value 时使用可选链或类型守卫。这是因为直到组件被挂载前,这个 ref 的值都是初始的 null,并且 v-if 将引用的元素卸载时也会被设置为 null。

InstanceType 为组件模板引用定义 TS 类型

首先需要通过 typeof 得到组件类型,再使用 TypeScript 内置的 InstanceType 工具类型来获取其实例类型

  1. const Foo = defineComponent(/* ... */)
  2. type FooInstance = InstanceType<typeof Foo>
  1. setup() {
  2. const modal = ref<InstanceType<typeof MyModal>>()
  3. const openModal = () => {
  4. modal.value?.open()
  5. }
  6. return { modal, openModal }
  7. }

请注意你还需要使用可选链操作符或其它方式来确认 modal.value 不是 undefined。