apiDefineComponent.ts 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313
  1. import type {
  2. ComponentInjectOptions,
  3. ComponentOptions,
  4. ComponentOptionsBase,
  5. ComponentOptionsMixin,
  6. ComponentProvideOptions,
  7. ComputedOptions,
  8. MethodOptions,
  9. RenderFunction,
  10. } from './componentOptions'
  11. import type {
  12. AllowedComponentProps,
  13. Component,
  14. ComponentCustomProps,
  15. GlobalComponents,
  16. GlobalDirectives,
  17. SetupContext,
  18. } from './component'
  19. import type {
  20. ComponentObjectPropsOptions,
  21. ComponentPropsOptions,
  22. ExtractDefaultPropTypes,
  23. ExtractPropTypes,
  24. } from './componentProps'
  25. import type {
  26. EmitsOptions,
  27. EmitsToProps,
  28. TypeEmitsToOptions,
  29. } from './componentEmits'
  30. import { type IsKeyValues, extend, isFunction } from '@vue/shared'
  31. import type { VNodeProps } from './vnode'
  32. import type {
  33. ComponentPublicInstanceConstructor,
  34. CreateComponentPublicInstanceWithMixins,
  35. } from './componentPublicInstance'
  36. import type { SlotsType } from './componentSlots'
  37. import type { Directive } from './directives'
  38. import type { ComponentTypeEmits } from './apiSetupHelpers'
  39. export type PublicProps = VNodeProps &
  40. AllowedComponentProps &
  41. ComponentCustomProps
  42. type ResolveProps<PropsOrPropOptions, E extends EmitsOptions> = Readonly<
  43. PropsOrPropOptions extends ComponentPropsOptions
  44. ? ExtractPropTypes<PropsOrPropOptions>
  45. : PropsOrPropOptions
  46. > &
  47. ({} extends E ? {} : EmitsToProps<E>)
  48. export type DefineComponent<
  49. PropsOrPropOptions = {},
  50. RawBindings = {},
  51. D = {},
  52. C extends ComputedOptions = ComputedOptions,
  53. M extends MethodOptions = MethodOptions,
  54. Mixin extends ComponentOptionsMixin = ComponentOptionsMixin,
  55. Extends extends ComponentOptionsMixin = ComponentOptionsMixin,
  56. E extends EmitsOptions = {},
  57. EE extends string = string,
  58. PP = PublicProps,
  59. Props = ResolveProps<PropsOrPropOptions, E>,
  60. Defaults = ExtractDefaultPropTypes<PropsOrPropOptions>,
  61. S extends SlotsType = {},
  62. LC extends Record<string, Component> = {},
  63. Directives extends Record<string, Directive> = {},
  64. Exposed extends string = string,
  65. Provide extends ComponentProvideOptions = ComponentProvideOptions,
  66. MakeDefaultsOptional extends boolean = true,
  67. TypeRefs extends Record<string, unknown> = {},
  68. TypeEl extends Element = any,
  69. > = ComponentPublicInstanceConstructor<
  70. CreateComponentPublicInstanceWithMixins<
  71. Props,
  72. RawBindings,
  73. D,
  74. C,
  75. M,
  76. Mixin,
  77. Extends,
  78. E,
  79. PP,
  80. Defaults,
  81. MakeDefaultsOptional,
  82. {},
  83. S,
  84. LC & GlobalComponents,
  85. Directives & GlobalDirectives,
  86. Exposed,
  87. TypeRefs,
  88. TypeEl
  89. >
  90. > &
  91. ComponentOptionsBase<
  92. Props,
  93. RawBindings,
  94. D,
  95. C,
  96. M,
  97. Mixin,
  98. Extends,
  99. E,
  100. EE,
  101. Defaults,
  102. {},
  103. string,
  104. S,
  105. LC & GlobalComponents,
  106. Directives & GlobalDirectives,
  107. Exposed,
  108. Provide
  109. > &
  110. PP
  111. export type DefineSetupFnComponent<
  112. P extends Record<string, any>,
  113. E extends EmitsOptions = {},
  114. S extends SlotsType = SlotsType,
  115. Props = P & EmitsToProps<E>,
  116. PP = PublicProps,
  117. > = new (
  118. props: Props & PP,
  119. ) => CreateComponentPublicInstanceWithMixins<
  120. Props,
  121. {},
  122. {},
  123. {},
  124. {},
  125. ComponentOptionsMixin,
  126. ComponentOptionsMixin,
  127. E,
  128. PP,
  129. {},
  130. false,
  131. {},
  132. S
  133. >
  134. type ToResolvedProps<Props, Emits extends EmitsOptions> = Readonly<Props> &
  135. Readonly<EmitsToProps<Emits>>
  136. // defineComponent is a utility that is primarily used for type inference
  137. // when declaring components. Type inference is provided in the component
  138. // options (provided as the argument). The returned value has artificial types
  139. // for TSX / manual render function / IDE support.
  140. // overload 1: direct setup function
  141. // (uses user defined props interface)
  142. export function defineComponent<
  143. Props extends Record<string, any>,
  144. E extends EmitsOptions = {},
  145. EE extends string = string,
  146. S extends SlotsType = {},
  147. >(
  148. setup: (
  149. props: Props,
  150. ctx: SetupContext<E, S>,
  151. ) => RenderFunction | Promise<RenderFunction>,
  152. options?: Pick<ComponentOptions, 'name' | 'inheritAttrs'> & {
  153. props?: (keyof NoInfer<Props>)[]
  154. emits?: E | EE[]
  155. slots?: S
  156. },
  157. ): DefineSetupFnComponent<Props, E, S>
  158. export function defineComponent<
  159. Props extends Record<string, any>,
  160. E extends EmitsOptions = {},
  161. EE extends string = string,
  162. S extends SlotsType = {},
  163. >(
  164. setup: (
  165. props: Props,
  166. ctx: SetupContext<E, S>,
  167. ) => RenderFunction | Promise<RenderFunction>,
  168. options?: Pick<ComponentOptions, 'name' | 'inheritAttrs'> & {
  169. props?: ComponentObjectPropsOptions<Props>
  170. emits?: E | EE[]
  171. slots?: S
  172. },
  173. ): DefineSetupFnComponent<Props, E, S>
  174. // overload 2: defineComponent with options object, infer props from options
  175. export function defineComponent<
  176. // props
  177. TypeProps,
  178. RuntimePropsOptions extends ComponentObjectPropsOptions =
  179. ComponentObjectPropsOptions,
  180. RuntimePropsKeys extends string = string,
  181. // emits
  182. TypeEmits extends ComponentTypeEmits = {},
  183. RuntimeEmitsOptions extends EmitsOptions = {},
  184. RuntimeEmitsKeys extends string = string,
  185. // other options
  186. Data = {},
  187. SetupBindings = {},
  188. Computed extends ComputedOptions = {},
  189. Methods extends MethodOptions = {},
  190. Mixin extends ComponentOptionsMixin = ComponentOptionsMixin,
  191. Extends extends ComponentOptionsMixin = ComponentOptionsMixin,
  192. InjectOptions extends ComponentInjectOptions = {},
  193. InjectKeys extends string = string,
  194. Slots extends SlotsType = {},
  195. LocalComponents extends Record<string, Component> = {},
  196. Directives extends Record<string, Directive> = {},
  197. Exposed extends string = string,
  198. Provide extends ComponentProvideOptions = ComponentProvideOptions,
  199. // resolved types
  200. ResolvedEmits extends EmitsOptions = {} extends RuntimeEmitsOptions
  201. ? TypeEmitsToOptions<TypeEmits>
  202. : RuntimeEmitsOptions,
  203. InferredProps = IsKeyValues<TypeProps> extends true
  204. ? TypeProps
  205. : string extends RuntimePropsKeys
  206. ? ComponentObjectPropsOptions extends RuntimePropsOptions
  207. ? {}
  208. : ExtractPropTypes<RuntimePropsOptions>
  209. : { [key in RuntimePropsKeys]?: any },
  210. TypeRefs extends Record<string, unknown> = {},
  211. TypeEl extends Element = any,
  212. >(
  213. options: {
  214. props?: (RuntimePropsOptions & ThisType<void>) | RuntimePropsKeys[]
  215. /**
  216. * @private for language-tools use only
  217. */
  218. __typeProps?: TypeProps
  219. /**
  220. * @private for language-tools use only
  221. */
  222. __typeEmits?: TypeEmits
  223. /**
  224. * @private for language-tools use only
  225. */
  226. __typeRefs?: TypeRefs
  227. /**
  228. * @private for language-tools use only
  229. */
  230. __typeEl?: TypeEl
  231. } & ComponentOptionsBase<
  232. ToResolvedProps<InferredProps, ResolvedEmits>,
  233. SetupBindings,
  234. Data,
  235. Computed,
  236. Methods,
  237. Mixin,
  238. Extends,
  239. RuntimeEmitsOptions,
  240. RuntimeEmitsKeys,
  241. {}, // Defaults
  242. InjectOptions,
  243. InjectKeys,
  244. Slots,
  245. LocalComponents,
  246. Directives,
  247. Exposed,
  248. Provide
  249. > &
  250. ThisType<
  251. CreateComponentPublicInstanceWithMixins<
  252. ToResolvedProps<InferredProps, ResolvedEmits>,
  253. SetupBindings,
  254. Data,
  255. Computed,
  256. Methods,
  257. Mixin,
  258. Extends,
  259. ResolvedEmits,
  260. {},
  261. {},
  262. false,
  263. InjectOptions,
  264. Slots,
  265. LocalComponents,
  266. Directives,
  267. string
  268. >
  269. >,
  270. ): DefineComponent<
  271. InferredProps,
  272. SetupBindings,
  273. Data,
  274. Computed,
  275. Methods,
  276. Mixin,
  277. Extends,
  278. ResolvedEmits,
  279. RuntimeEmitsKeys,
  280. PublicProps,
  281. ToResolvedProps<InferredProps, ResolvedEmits>,
  282. ExtractDefaultPropTypes<RuntimePropsOptions>,
  283. Slots,
  284. LocalComponents,
  285. Directives,
  286. Exposed,
  287. Provide,
  288. // MakeDefaultsOptional - if TypeProps is provided, set to false to use
  289. // user props types verbatim
  290. unknown extends TypeProps ? true : false,
  291. TypeRefs,
  292. TypeEl
  293. >
  294. // implementation, close to no-op
  295. /*@__NO_SIDE_EFFECTS__*/
  296. export function defineComponent(
  297. options: unknown,
  298. extraOptions?: ComponentOptions,
  299. ) {
  300. return isFunction(options)
  301. ? /*@__PURE__*/ (() =>
  302. extend({ name: options.name }, extraOptions, { setup: options }))()
  303. : options
  304. }