import { Component, PropValidator } from '@vue/runtime-core' import { camelize } from '@vue/shared' export function prop( target: Component | PropValidator<any>, key?: string ): any { if (key) { applyProp(target, key) } else { const options = target as PropValidator<any> return (target: any, key: string) => { applyProp(target, key, options) } } } function applyProp(target: any, key: string, options: PropValidator<any> = {}) { // here `target` is the prototype of the component class Object.defineProperty(target, `__prop_${camelize(key)}`, { value: options }) }