apiDefineComponent.ts 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305
  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 { 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. > = ComponentPublicInstanceConstructor<
  69. CreateComponentPublicInstanceWithMixins<
  70. Props,
  71. RawBindings,
  72. D,
  73. C,
  74. M,
  75. Mixin,
  76. Extends,
  77. E,
  78. PP & Props,
  79. Defaults,
  80. MakeDefaultsOptional,
  81. {},
  82. S,
  83. LC & GlobalComponents,
  84. Directives & GlobalDirectives,
  85. Exposed,
  86. TypeRefs
  87. >
  88. > &
  89. ComponentOptionsBase<
  90. Props,
  91. RawBindings,
  92. D,
  93. C,
  94. M,
  95. Mixin,
  96. Extends,
  97. E,
  98. EE,
  99. Defaults,
  100. {},
  101. string,
  102. S,
  103. LC & GlobalComponents,
  104. Directives & GlobalDirectives,
  105. Exposed,
  106. Provide
  107. > &
  108. PP
  109. export type DefineSetupFnComponent<
  110. P extends Record<string, any>,
  111. E extends EmitsOptions = {},
  112. S extends SlotsType = SlotsType,
  113. Props = P & EmitsToProps<E>,
  114. PP = PublicProps,
  115. > = new (
  116. props: Props & PP,
  117. ) => CreateComponentPublicInstanceWithMixins<
  118. Props,
  119. {},
  120. {},
  121. {},
  122. {},
  123. ComponentOptionsMixin,
  124. ComponentOptionsMixin,
  125. E,
  126. PP,
  127. {},
  128. false,
  129. {},
  130. S
  131. >
  132. // defineComponent is a utility that is primarily used for type inference
  133. // when declaring components. Type inference is provided in the component
  134. // options (provided as the argument). The returned value has artificial types
  135. // for TSX / manual render function / IDE support.
  136. // overload 1: direct setup function
  137. // (uses user defined props interface)
  138. export function defineComponent<
  139. Props extends Record<string, any>,
  140. E extends EmitsOptions = {},
  141. EE extends string = string,
  142. S extends SlotsType = {},
  143. >(
  144. setup: (
  145. props: Props,
  146. ctx: SetupContext<E, S>,
  147. ) => RenderFunction | Promise<RenderFunction>,
  148. options?: Pick<ComponentOptions, 'name' | 'inheritAttrs'> & {
  149. props?: (keyof Props)[]
  150. emits?: E | EE[]
  151. slots?: S
  152. },
  153. ): DefineSetupFnComponent<Props, E, S>
  154. export function defineComponent<
  155. Props extends Record<string, any>,
  156. E extends EmitsOptions = {},
  157. EE extends string = string,
  158. S extends SlotsType = {},
  159. >(
  160. setup: (
  161. props: Props,
  162. ctx: SetupContext<E, S>,
  163. ) => RenderFunction | Promise<RenderFunction>,
  164. options?: Pick<ComponentOptions, 'name' | 'inheritAttrs'> & {
  165. props?: ComponentObjectPropsOptions<Props>
  166. emits?: E | EE[]
  167. slots?: S
  168. },
  169. ): DefineSetupFnComponent<Props, E, S>
  170. // overload 2: defineComponent with options object, infer props from options
  171. export function defineComponent<
  172. // props
  173. TypeProps,
  174. RuntimePropsOptions extends
  175. ComponentObjectPropsOptions = ComponentObjectPropsOptions,
  176. RuntimePropsKeys extends string = string,
  177. // emits
  178. TypeEmits extends ComponentTypeEmits = {},
  179. RuntimeEmitsOptions extends EmitsOptions = {},
  180. RuntimeEmitsKeys extends string = string,
  181. // other options
  182. Data = {},
  183. SetupBindings = {},
  184. Computed extends ComputedOptions = {},
  185. Methods extends MethodOptions = {},
  186. Mixin extends ComponentOptionsMixin = ComponentOptionsMixin,
  187. Extends extends ComponentOptionsMixin = ComponentOptionsMixin,
  188. InjectOptions extends ComponentInjectOptions = {},
  189. InjectKeys extends string = string,
  190. Slots extends SlotsType = {},
  191. LocalComponents extends Record<string, Component> = {},
  192. Directives extends Record<string, Directive> = {},
  193. Exposed extends string = string,
  194. Provide extends ComponentProvideOptions = ComponentProvideOptions,
  195. // resolved types
  196. ResolvedEmits extends EmitsOptions = {} extends RuntimeEmitsOptions
  197. ? TypeEmitsToOptions<TypeEmits>
  198. : RuntimeEmitsOptions,
  199. InferredProps = unknown extends TypeProps
  200. ? string extends RuntimePropsKeys
  201. ? ComponentObjectPropsOptions extends RuntimePropsOptions
  202. ? {}
  203. : ExtractPropTypes<RuntimePropsOptions>
  204. : { [key in RuntimePropsKeys]?: any }
  205. : TypeProps,
  206. ResolvedProps = Readonly<InferredProps & EmitsToProps<ResolvedEmits>>,
  207. TypeRefs extends Record<string, unknown> = {},
  208. >(
  209. options: {
  210. props?: (RuntimePropsOptions & ThisType<void>) | RuntimePropsKeys[]
  211. /**
  212. * @private for language-tools use only
  213. */
  214. __typeProps?: TypeProps
  215. /**
  216. * @private for language-tools use only
  217. */
  218. __typeEmits?: TypeEmits
  219. /**
  220. * @private for language-tools use only
  221. */
  222. __typeRefs?: TypeRefs
  223. } & ComponentOptionsBase<
  224. ResolvedProps,
  225. SetupBindings,
  226. Data,
  227. Computed,
  228. Methods,
  229. Mixin,
  230. Extends,
  231. RuntimeEmitsOptions,
  232. RuntimeEmitsKeys,
  233. {}, // Defaults
  234. InjectOptions,
  235. InjectKeys,
  236. Slots,
  237. LocalComponents,
  238. Directives,
  239. Exposed,
  240. Provide
  241. > &
  242. ThisType<
  243. CreateComponentPublicInstanceWithMixins<
  244. ResolvedProps,
  245. SetupBindings,
  246. Data,
  247. Computed,
  248. Methods,
  249. Mixin,
  250. Extends,
  251. ResolvedEmits,
  252. RuntimeEmitsKeys,
  253. {},
  254. false,
  255. InjectOptions,
  256. Slots,
  257. LocalComponents,
  258. Directives,
  259. Exposed
  260. >
  261. >,
  262. ): DefineComponent<
  263. InferredProps,
  264. SetupBindings,
  265. Data,
  266. Computed,
  267. Methods,
  268. Mixin,
  269. Extends,
  270. ResolvedEmits,
  271. RuntimeEmitsKeys,
  272. PublicProps,
  273. ResolvedProps,
  274. ExtractDefaultPropTypes<RuntimePropsOptions>,
  275. Slots,
  276. LocalComponents,
  277. Directives,
  278. Exposed,
  279. Provide,
  280. // MakeDefaultsOptional - if TypeProps is provided, set to false to use
  281. // user props types verbatim
  282. unknown extends TypeProps ? true : false,
  283. TypeRefs
  284. >
  285. // implementation, close to no-op
  286. /*! #__NO_SIDE_EFFECTS__ */
  287. export function defineComponent(
  288. options: unknown,
  289. extraOptions?: ComponentOptions,
  290. ) {
  291. return isFunction(options)
  292. ? // #8326: extend call and options.name access are considered side-effects
  293. // by Rollup, so we have to wrap it in a pure-annotated IIFE.
  294. /*#__PURE__*/ (() =>
  295. extend({ name: options.name }, extraOptions, { setup: options }))()
  296. : options
  297. }