import { Vue } from './vue' import { VNode } from './vnode' import { ComponentOptions as Vue2ComponentOptions } from './options' import { EmitsOptions, SetupContext } from './v3-setup-context' import { Data } from './common' import { ComponentPropsOptions, ExtractPropTypes } from './v3-component-props' import { ComponentRenderProxy } from './v3-component-proxy' export { ComponentPropsOptions } from './v3-component-props' export type ComputedGetter = (ctx?: any) => T export type ComputedSetter = (v: T) => void export interface WritableComputedOptions { get: ComputedGetter set: ComputedSetter } export type ComputedOptions = Record< string, ComputedGetter | WritableComputedOptions > export interface MethodOptions { [key: string]: Function } export type SetupFunction< Props, RawBindings = {}, Emits extends EmitsOptions = {} > = ( this: void, props: Readonly, ctx: SetupContext ) => RawBindings | (() => VNode | null) | void interface ComponentOptionsBase< Props, D = Data, C extends ComputedOptions = {}, M extends MethodOptions = {} > extends Omit< Vue2ComponentOptions, 'data' | 'computed' | 'method' | 'setup' | 'props' > { // allow any custom options [key: string]: any // rewrite options api types data?: (this: Props & Vue, vm: Props) => D computed?: C methods?: M } export type ExtractComputedReturns = { [key in keyof T]: T[key] extends { get: (...args: any[]) => infer TReturn } ? TReturn : T[key] extends (...args: any[]) => infer TReturn ? TReturn : never } export type ComponentOptionsWithProps< PropsOptions = ComponentPropsOptions, RawBindings = Data, D = Data, C extends ComputedOptions = {}, M extends MethodOptions = {}, Mixin = {}, Extends = {}, Emits extends EmitsOptions = {}, EmitsNames extends string = string, Props = ExtractPropTypes > = ComponentOptionsBase & { props?: PropsOptions emits?: (Emits | EmitsNames[]) & ThisType setup?: SetupFunction } & ThisType< ComponentRenderProxy > export type ComponentOptionsWithArrayProps< PropNames extends string = string, RawBindings = Data, D = Data, C extends ComputedOptions = {}, M extends MethodOptions = {}, Mixin = {}, Extends = {}, Emits extends EmitsOptions = {}, EmitsNames extends string = string, Props = Readonly<{ [key in PropNames]?: any }> > = ComponentOptionsBase & { props?: PropNames[] emits?: (Emits | EmitsNames[]) & ThisType setup?: SetupFunction } & ThisType< ComponentRenderProxy > export type ComponentOptionsWithoutProps< Props = {}, RawBindings = Data, D = Data, C extends ComputedOptions = {}, M extends MethodOptions = {}, Mixin = {}, Extends = {}, Emits extends EmitsOptions = {}, EmitsNames extends string = string > = ComponentOptionsBase & { props?: undefined emits?: (Emits | EmitsNames[]) & ThisType setup?: SetupFunction } & ThisType< ComponentRenderProxy > export type WithLegacyAPI = T & Omit, keyof T>