diff --git a/packages/runtime-core/src/componentOptions.ts b/packages/runtime-core/src/componentOptions.ts index 39087e8c..40c861cb 100644 --- a/packages/runtime-core/src/componentOptions.ts +++ b/packages/runtime-core/src/componentOptions.ts @@ -51,6 +51,24 @@ import { Directive } from './directives' import { ComponentPublicInstance } from './componentProxy' import { warn } from './warning' +/** + * Interface for declaring custom options. + * + * @example + * ```ts + * declare module '@vue/runtime-core' { + * interface ComponentCustomOptions { + * beforeRouteUpdate?( + * to: Route, + * from: Route, + * next: () => void + * ): void + * } + * } + * ``` + */ +export interface ComponentCustomOptions {} + export interface ComponentOptionsBase< Props, RawBindings, @@ -59,7 +77,10 @@ export interface ComponentOptionsBase< M extends MethodOptions, E extends EmitsOptions, EE extends string = string -> extends LegacyOptions, SFCInternalOptions { +> + extends LegacyOptions, + SFCInternalOptions, + ComponentCustomOptions { setup?: ( this: void, props: Props, diff --git a/packages/runtime-core/src/index.ts b/packages/runtime-core/src/index.ts index f4273cc3..316e1c7d 100644 --- a/packages/runtime-core/src/index.ts +++ b/packages/runtime-core/src/index.ts @@ -189,8 +189,9 @@ export { export { ComponentOptions, ComponentOptionsWithoutProps, - ComponentOptionsWithObjectProps as ComponentOptionsWithProps, - ComponentOptionsWithArrayProps + ComponentOptionsWithObjectProps, + ComponentOptionsWithArrayProps, + ComponentCustomOptions } from './componentOptions' export { ComponentPublicInstance, diff --git a/test-dts/componentCustomProperties.test-d.ts b/test-dts/componentTypeExtensions.test-d.ts similarity index 71% rename from test-dts/componentCustomProperties.test-d.ts rename to test-dts/componentTypeExtensions.test-d.ts index 60267c6b..5066f0b9 100644 --- a/test-dts/componentCustomProperties.test-d.ts +++ b/test-dts/componentTypeExtensions.test-d.ts @@ -1,7 +1,11 @@ -import { expectError } from 'tsd' +import { expectError, expectType } from 'tsd' import { defineComponent } from './index' declare module '@vue/runtime-core' { + interface ComponentCustomOptions { + test?(n: number): void + } + interface ComponentCustomProperties { state: 'stopped' | 'running' } @@ -9,6 +13,11 @@ declare module '@vue/runtime-core' { export const Custom = defineComponent({ data: () => ({ counter: 0 }), + + test(n) { + expectType(n) + }, + methods: { aMethod() { expectError(this.notExisting)