Vue过滤器应该如何使用typescript绑定?

Posted

技术标签:

【中文标题】Vue过滤器应该如何使用typescript绑定?【英文标题】:How should Vue filters be bound using typescript? 【发布时间】:2017-11-04 03:36:03 【问题描述】:

Vue过滤器应该如何使用TypeScript绑定?使用纯 js 相当简单,但我在将其转换为 TypeScript 时遇到了问题。

代码及编译错误如下:

app.ts

import * as Vue from 'vue'
...
import * as filters from './util/filters'

// register global utility filters.
Object.keys(filters).forEach(key => 
  Vue.filter(key, filters[key]);
)

util/filters.ts

export function host (url: string) 
  ...


export function timeAgo (time: any) 
  ....

编译错误

错误 TS7017:元素隐式具有“任何”类型,因为类型“typeof ...”没有索引签名。

【问题讨论】:

【参考方案1】:

我正在使用一个名为 vue-property-decorator 的库,您可以在其中执行以下操作:

import  Component, Vue  from 'vue-property-decorator'

@Component(
  name: 'ComponentName',
  filters: 
    filterName(value: any) 
      return 'Hello filter'
    
  
)
export default class ComponentName extends Vue 
  textToFormat = 'Hello world'

然后应用过滤器:

<p> textToFormat | filterName </p>

编码愉快!

【讨论】:

所以你手动注入并在每个组件中重复你的代码? 您可以将您想要重用的过滤器作为全局过滤器添加到 Vue 实例,请参阅https://vuejs.org/v2/guide/filters。这通常在您引导项目的main.js 文件中完成。 问题不是关于如何在全球范围内制作它,而是关于你上面的类组件样式的代码。您是否尝试将所有过滤器包含在 main.ts 中?我遇到过类型问题:***.com/questions/57672886/… @AlexanderKim 你可以这样做:import myFilter from '@/filters/my.filter';@Component( filters: myFilter ) @Arajay,我的意思是全局导入所有组件,而不是一个一个。【参考方案2】:

在这种情况下,您可以简单地使用类型断言

Object.keys(filters).forEach(key => 
  Vue.filter(key, (filters as any)[key])
)

【讨论】:

【参考方案3】:

为了在全局范围内添加过滤器,我做了如下操作

// in customFilter.ts file

import Vue from 'vue';

const testFilter = Vue.filter(
  'filterName', () => 
    // filter fn
   
);
export default testFilter;

并将其包含在 main.ts 中

import testFilter from '@/customFilter.ts'

new Vue(
...
  filters: 
    testFilter
  ,
...

【讨论】:

【参考方案4】:

我这样注册全局过滤器:

内部plugins/filters.ts

import  VueConstructor  from 'vue/types/umd'

export default 
  install (Vue: VueConstructor) 
    Vue.filter('someFormatFunc1', function someFormatFunc1(value) 
      // Your formatting function
    )
    Vue.filter('someFormatFunc2', function someFormatFunc2(value) 
      // Your formatting function
    )
  

然后在main.ts

import filters from './plugins/filters'
Vue.use(filters)

【讨论】:

以上是关于Vue过滤器应该如何使用typescript绑定?的主要内容,如果未能解决你的问题,请参考以下文章

(如何)我应该在 Vue.js 组件(TypeScript)中使用访问修饰符(公共、私有等)吗?

使用TypeScript创建Vue项目

使用 Vuex mapGetters 时如何修复 TypeScript 错误?

vue属性绑定函数何时执行

vue2 + typescript2 自定义过滤器

如何使用 Typescript 在 Vue 应用程序中使用 webcomponents