如何使用TypeScript在Vue.js中指定非反应实例属性?

Har*_*til 5 javascript typescript vue.js vuejs2

我正在将Vue.js组件迁移到TypeScript。按照指南进行操作,我尝试将其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
     };
  }

});
Run Code Online (Sandbox Code Playgroud)

在上面的示例中,我具有x反应性和y非反应性属性。但是,y由于扩展在TypeScript中的工作方式,我只是无法获得适用于属性的类型推断。

我无法使用简单的对象导出来定义组件,因为它开始对y和都引发类型错误x

为此,现在我坚持将此文件保留为JS或移动我的代码vue-class-component以使我能够处理此文件。但是,我不愿意转向vue-class-component它,因为它是库级别的代码。

有什么办法可以使我TypeScript快乐吗?

And*_*kin 6

一个最简单的解决方案是这样的:

  data() {
     return {
        // x is reactive property
        x: 10
     } as any as { x: number; y: number };
  }
Run Code Online (Sandbox Code Playgroud)

但是,这要求您显式定义data.


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

function withNonReactive<TData>(data: TData) {
    return <TNonReactive>() => data as TData & TNonReactive;
}
Run Code Online (Sandbox Code Playgroud)

像这样:

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