我正在将Vue.js个组件迁移到TypeScript.在guide之后,我try 使用Vue.extend()作为我的组件.我的组成部分是:

import Vue from 'vue';

const Component = Vue.extend({
  // type inference enabled

  created() {
    // `y` is non-reactive property
    this.y = 20; // TYPESCRIPT THROWS ERROR
  }

  data() {
     return {
        // x is reactive property
        x: 10
     };
  }

});

在上面的例子中,属性x是react 性的,属性y是非react 性的.然而,由于在TypeScript中扩展的工作方式,我无法让类型推断在property y中工作.

我不能使用简单对象导出来定义我的组件,因为它开始为yx抛出类型错误.

因为,现在我坚持将这个文件作为JS保存,或者将代码移动到vue-class-component,这使我能够处理这个问题.然而,我不愿意改为vue-class-component,因为这是一个库级别的代码.

有什么办法能让TypeScript人开心吗?

推荐答案

最简单的解决方案如下:

  data() {
     return {
        // x is reactive property
        x: 10
     } as any as { x: number; y: number };
  }

但是,这需要显式定义data的所有属性.


或者,您也可以使用以下帮助器执行此操作:

function withNonReactive<TData>(data: TData) {
    return <TNonReactive>() => data as TData & TNonReactive;
}

这样地:

  data() {
     return withNonReactive({
        // x is reactive property
        x: 10
     })<{
        // non-reactive properties go here
        y: number
     }>();
  }

Vue.js相关问答推荐

vue3 输入标签给出错误 Vue.use 不是函数

如何 for each 动态创建的按钮/文本字段设置唯一变量?

Vue 和 Nuxt 之间生命周期钩子的不同行为

带有热重载的 docker 容器上的 Vue.js 应用程序

VueJS 插件的如何react式绑定?

Vue 和 Bootstrap Vue - 动态使用插槽

如何将 ASP.NET Core 2.1 与 Vue CLI 3 集成?

eslint – 如何知道 defined定义规则的位置

正确的 vueJS 方法将props与数据同步

Vue devServer 代理没有帮助,我仍然收到 CORS 错误

Vuetify 2 个工具栏和 1 个导航抽屉,navigation drawer导航抽屉上方有 1 个工具栏

加载时焦点文本框上的 Vue.js

如何从 vue-apollo 中访问 this.$route?

如何在 JEST 测试中模拟全局 Vue.js 变量

Laravel 和 Vue - handler.call 不是函数

Vue.js 的 $emit 和 $dispatch 有什么区别?

如何在 NuxtJS 中设置全局 $axios 标头

Vuetify RTL 风格

Vue Cli 3:定义的输出路径

mount() 仅在组件 Vue.js 上运行一次