我正在try 向Vue 2网页包模板添加Flow.作为记录,我只在运行时(文件遵循.vue格式/标准).

我的第一次try 是通过cli使用flow,我意识到它不会工作,因为它不知道如何处理.vue个文件.

我的第二次try 是添加一个webpack加载程序(即flow-status-webpack-plugin),并在构建过程中运行流判断(例如eslint works).但没有成功,所以我研究了其他 Select .

我的第三次try 是使用一个babel插件,一开始相当成功.我用了babel-plugin-typecheck+babel-plugin-syntax-flow.Webpack中没有输出,但是类型错误会 destruct 应用程序.我同意这种方法;它与CI配合使用会很好,并且会 destruct 构建.

以下是我的.babelrc岁生日的样子:

{
  ...
  "plugins": [
    ...
    ["typecheck", {
      "disable": {
        "production": true
      }
    }],
    "syntax-flow",
    "transform-flow-strip-types"
  ],
  ...
}

此时,Flow与全局方法的预期一样工作,但在Vue组件中不起作用:

<template>...</template>

<script>
/* @flow */
const flowIt = (a: number): number => {
  return a * 10
}

flowIt(20)
flowIt('bah') // Uncaught TypeError: Value of argument "a" violates contract. Expected: number Got: string

export default {    
  mounted: function () {
    flowIt(20)
    flowIt('bah') // Sees nothing wrong here
  }
}
</script>

<style>...</style>

除此之外,我们的目标是不要因为流量而更改应用程序代码.理想情况下,我会像往常一样使用Vue:

<template>...</template>

<script>
/* @flow */
export default {  
  methods: {
    flowIt (a: number): number {
      return a * 10
    }
  },

  mounted: function () {
    this.flowIt(20)
    this.flowIt('bah') // Should throw a type error.
  }
}
</script>

<style>...</style>

不确定这是否与Vue有那么大的关系,就像我对Flow的体验一样(提示:没有那么丰富的经验).我想我需要一些类型文件,让Flow"理解"Vue组件的 struct (我猜指令也是如此).

对于那些有更多经验的人来说,你是如何让Flow正确使用Vue+webpack的?

推荐答案

您仍然可以将流用于应用程序的JS部分.vue组件,注释掉<template><style><script>部分:

 /* @flow
 <style>
 ...style definitions here
 </style>
 <template>
 ...html...
 </template>
 */
 // <script>
 export default {  
   methods: {
      flowIt (a: number): number {
         return a * 10
      }
   },

   mounted: function () {
      this.flowIt(20)
      this.flowIt('bah') //Won't throw error, as flowIt is attached to
                         //this.
   }
}
// </script>

即使在注释时,vue编译器仍将识别<template>, <style> and <script>个部分,但流类型判断器将忽略它们,只处理正确的javascript部分.

不幸的是,这并不能使您获得this%的类型覆盖率,因为Flow将无法判断连接到this的函数和对象(Vue组件本身),但是,您仍然可以从Flow对外部函数(例如Vuex操作和getter、其他javascript导入模块)的调用的类型判断中获益,如果在组件的方法中扩展了业务逻辑,那么在使用方法参数时可以获得某种类型安全性.

Vue.js相关问答推荐

Nuxt 3:从注册表单发出输入值

在VueJS中卸载元素之前是否应该删除JavaScript事件收件箱?

为什么在Vue.js中修改非react 性似乎是react 性的?

通过另一个文件调用模块化窗口组件

vue3中的转换可以在滑入但不能滑出时工作

Vuetify右侧并排switch

aspnet core如何在deploy上构建webpack

使用 v-slot:body 时 Vuetify v-data-table 没有响应

Vue cli 3项目,图像路径中的动态src不起作用

将检测外部点击自定义指令从 Vue 2 迁移到 Vue 3

在 vuejs 中的图像中包含 router-link 标记

在组件的样式部分使用 Vue 变量

Vuetify v-select 组件宽度变化

v-on:submit.prevent 不停止表单提交

Proxy代理在 Vue 3 的控制台中是什么意思?

取消选中单选按钮

安装后运行computed计算函数

Vuejs获取事件正在调用的元素?

偶数行格式化

$emit 不会触发子事件