我所做
的我最初的方法是使用以下返回类装饰器的mixin:
function createMixin (behaviour: any, sharedBehaviour: any = {}): any {
const instanceKeys: any = Reflect.ownKeys(behaviour)
const sharedKeys: any = Reflect.ownKeys(sharedBehaviour)
const typeTag = Symbol(`isa`)
function _mixin (clazz: Function): Function {
for (let property of instanceKeys) {
Object.defineProperty(clazz.prototype, property, {
value: behaviour[property],
writable: true
})
}
Object.defineProperty(clazz.prototype, typeTag, { value: true })
return clazz
}
for (let property of sharedKeys) {
Object.defineProperty(_mixin, property, {
value: sharedBehaviour[property],
enumerable: sharedBehaviour.propertyIsEnumerable(property)
})
}
Object.defineProperty(_mixin, Symbol.hasInstance, {
value: (i: any) => !!i[typeTag]
})
return _mixin
}
export const customUtil = createMixin({
customUtil (event: any) {
console.log(this)
}
})
所以稍后可以使用 util 来装饰类,并且可以毫无问题地访问目标类的 this:
import { customUtil } from 'utils'
@customUtil
export default class ComponentClass extends Vue {
someClassMethod() {
this.customUtil() // successfully outputs the whole class in the console
}
}
但它会导致 tslinter 警告TS2339: Property 'customUtil' does not exist on type 'ComponentClass'.
问题
1. 是否有可能通过以某种方式“键入”由 mixin 实用程序分配给类的方法来解决 linter 问题
2. 如果有一种替代方法可以让实用程序函数/类可以毫无问题地访问它使用它们的类以及附加它们的简单方法?