关于 Vue 3 + TypeScript 和 Augmenting-Types-for-Use-with-Plugins 的问题

Posted

技术标签:

【中文标题】关于 Vue 3 + TypeScript 和 Augmenting-Types-for-Use-with-Plugins 的问题【英文标题】:Question about Vue 3 + TypeScript and Augmenting-Types-for-Use-with-Plugins 【发布时间】:2021-01-15 00:14:31 【问题描述】:

有谁知道应该如何使用 Vue3 和 TypeScript 实现类型增强的工作示例?我一直在尝试遵循 Vue2 文档,在 Vue3 中使用相同的文档但没有成功,过去 3 个小时的搜索没有任何结果。

似乎应该扩充vue-class-component 模块中的Vue 对象以使其工作,但是如何?

我的实现类似于以下:

有什么建议吗?

https://vuejs.org/v2/guide/typescript.html#Augmenting-Types-for-Use-with-Plugins

import  App, Plugin  from "vue";

export interface IHelloModule 
  sayHello: (name: string) => string;


export const helloPlugin: Plugin = (app: App, options) => 

  const helloModule:IHelloModule = 

    sayHello: function(name: string) 
      return `Hello $name`;
    

  ;

  app.provide("$hello", helloModule);
;
import  Vue  from 'vue-class-component';
import  IHelloModule  from "@/hello";

declare module "vue/types/vue" 
  interface Vue 
    $hello: IHelloModule;
  


declare module "vue/types/vue" 
  interface VueConstructor 
    $auth: IHelloModule;
  

<template>
  <div class="home">
     .....
  </div>
</template>

<script lang="ts">
import  Options, Vue  from 'vue-class-component';

@Options(
  components: 
  ,
)
export default class Home extends Vue 
  mounted() 
    console.log(this.$hello.sayHello("World"))
                     ^^^^^^^^^^^^^^^^^^^^^^^^^^
                     Neither TS nor vue-cli recognize this
  

</script>
import  createApp  from "vue";
import App from "./App.vue";
import  helloPlugin  from "./hello";
import router from "./router";

createApp(App)
  .use(router, helloPlugin)
  .mount("#app");

【问题讨论】:

【参考方案1】:

据我了解,vue-class-component 还不完全支持 Vue 3。它们仍然是库中的discussing 修改。所以,我不知道下面的例子是否适用,但这是我为增加插件类型所做的。

hello.plugin.ts

import  App  from "vue";

export interface IHelloModule 
  sayHello: (name: string) => string;


export default 
  install: (app: App) => 
    const helloModule: IHelloModule = 
      sayHello: function(name: string) 
        return `Hello $name`;
      
    ; 

    app.config.globalProperties.$hello = helloModule;
  


declare module "@vue/runtime-core" 
  //Bind to `this` keyword
  interface ComponentCustomProperties 
    $hello: IHelloModule;
  

我在插件文件本身中声明了类型,但您也可以在shims-vue.d.ts 文件中声明它们。

main.ts

import  createApp  from "vue";
import App from "./App.vue";
import router from "./router";
import Hello from "./hello.plugin";

createApp(App)
  .use(router)
  .use(Hello)
  .mount("#app");

你好.vue

<script lang="ts">
import  defineComponent  from "vue";

const Hello = defineComponent(
  mounted() 
    console.log(this.$hello.sayHello("World"));
  
);

export default Hello;
</script>

【讨论】:

我使用了其中一个 CLI 模板,组件 HelloWorld 是这样写的:class HelloWorld extends Vue msg!: string; 。在里面,我定义了mounted 函数,编译器抛出了this 关键字上不存在$ 变量(您的示例中的$hello)的错误。我是 Vue 新手,所以我不确定自己缺少什么,也没有找到太多 Vue + TS + 插件的资源。 @RodrigoGomez-Palacio 抱歉,之前没有看到您的评论。也许是因为您使用的是类组件而不是函数组件?我不再使用 Vue,但据我所知,建议将 defineComponent 与 Vue 3 + TS 一起使用。

以上是关于关于 Vue 3 + TypeScript 和 Augmenting-Types-for-Use-with-Plugins 的问题的主要内容,如果未能解决你的问题,请参考以下文章

尤雨溪回应:Vue与TypeScript为什么相性特别差?

vue+typescript基础练习

大三实训,我用Nodejs和Vue3以及Typescript做了一个关于医院的后台管理系统 ❥(^_-)

通过 Typescript 构建 Vite 和 Global Vue 3 组件

关于TypeScript

Vue 3 和 Typescript - 无法访问方法中的数据属性