vue3+typescript实战记录二(typescript-eslint)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了vue3+typescript实战记录二(typescript-eslint)相关的知识,希望对你有一定的参考价值。

参考技术A 本文记录一些vue3+typescript+less开发过程中的一些小问题。

不断开发、不断更新...

vue.config.js 文件中 require('path') 加载path模块,eslint报错error Require statement not part of import statement 。

对应eslint规则: 戳这里

vue.config.js 中设置别名 alias

在 main.ts 中引入设置别名的模块时,提示 Cannot find module 'config/element.config' or its corresponding type declarations

tsconfig.json ts配置文件中增加 paths
参考文档: 模块解析-路径映射

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

【中文标题】关于 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 一起使用。

以上是关于vue3+typescript实战记录二(typescript-eslint)的主要内容,如果未能解决你的问题,请参考以下文章

三个小时vue3.x从零到实战(typescript的搭建使用及资料)

Vue3.x 从零开始—— Router + Vuex + TypeScript 实战演练(上)

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

如何在 Vue3 中启用仅使用 TypeScript 的道具键入

vite + vue3 添加 typescript

不习惯的Vue3起步二 の alias别名ref和reactive