如何在 Vue 2 和 TypeScript 中将 $refs 字段转换为其组件类型?

Posted

技术标签:

【中文标题】如何在 Vue 2 和 TypeScript 中将 $refs 字段转换为其组件类型?【英文标题】:How to convert $refs field to its component type in Vue 2 & TypeScript? 【发布时间】:2022-01-01 14:17:48 【问题描述】:

我正在将我的 Vue 2.x 项目从 javascript 迁移到 TypeScript。由于一些历史原因,我没有机会使用Class Style Vue Component,所以我使用Vue.extend的方式。

这是我的ValidPeriod.vue(为简单起见,省略一些代码):

<template>
  <div>
    <div>Some content...</div>
  </div>
</template>

<script lang="ts">
import Vue from 'vue';

export default Vue.extend(
  data() 
    return ;
  ,
  methods: 
    isValidate() 
      return false;
    ,
  ,
);
</script>

现在我正在迁移使用ValidPeriod.vueApp.vue

<template>
  <div>
    <ValidPeriod ref="validPeriod" />
  </div>
</template>

<script lang="ts">
import Vue from 'vue';
import ValidPeriod from './ValidPeriod.vue';

export default Vue.extend(
  components: 
    ValidPeriod,
  ,
  data() 
    return ;
  ,
  mounted() 
    validPeriod.isValidate();
  ,
);

现在我收到 TS 错误:

TS2339:“Vue | 类型”上不存在属性“isValidate”元素 | Vue[] |元素[]'。类型“Vue”上不存在属性“isValidate”。

然后我尝试投射它:

(this.$refs.validPeriod as ValidPeriod).isValidate();

现在我明白了:

TS2749:“ValidPeriod”指的是一个值,但在这里被用作一个类型。您的意思是“typeof ValidPeriod”吗?

好的,我添加typeof,然后得到:

TS2352:'Vue | 类型的转换元素 | Vue[] | Element[]' 输入 'ExtendedVue' 可能是一个错误,因为这两种类型都没有与另一种充分重叠。如果这是故意的,请先将表达式转换为“未知”。类型 'Element[]' 缺少来自类型 'VueConstructor':extend、nextTick、set、delete 等等。

所以我的问题是如何从ExtendedVue&lt;Vue, ... 中派生一些类型,以便可以识别ValidPeriod.vue 中定义的字段?

【问题讨论】:

这能回答你的问题吗? Vuejs typescript this.$refs.<refField>.value does not exist 【参考方案1】:

对于初学者,要使其正常工作,请尝试

(this.$refs.validPeriod as any).isValidate();

接下来,您可能会尝试直接从模块中导入类型。也许这样可以解决问题。

import type ValidPeriod from './ValidPeriod.vue';

【讨论】:

以上是关于如何在 Vue 2 和 TypeScript 中将 $refs 字段转换为其组件类型?的主要内容,如果未能解决你的问题,请参考以下文章

在 Vue 3 Typescript 中将道具传递给数据对象

如何在 TypeScript 中将 Set 转换为数组

如何在 Vue 中以 Typescript 语法定义使用 prop 作为其初始值的本地数据属性?

TypeScript:如何在 0.8.0.0 之后的版本中将 null 传递给重载函数?

如何在 TypeScript Angular 2 中将 Json 对象数组映射到另一个普通 json 对象

如何在 Typescript 中将 ref prop 和 useRef 与 Lottie 文件一起使用?