app.use(PluginWithoutType, { anything: 'goes' }, true)
type PluginOptions = {
+ /** option1 */
option1?: string
+ /** option2 */
option2: number
+ /** option3 */
option3: boolean
}
},
}
+const objectPluginOptional = {
+ install(app: App, options?: PluginOptions) {},
+}
+app.use(objectPluginOptional)
+app.use(
+ objectPluginOptional,
+ // Test JSDoc and `go to definition` for options
+ {
+ option1: 'foo',
+ option2: 1,
+ option3: true,
+ },
+)
+
for (const Plugin of [
PluginWithObjectOptions,
PluginWithObjectOptions.install,
// @ts-expect-error: needs options
app.use(PluginTyped)
-app.use(PluginTyped, { option2: 2, option3: true })
+app.use(
+ PluginTyped,
+ // Test autocomplete for options
+ {
+ option1: '',
+ option2: 2,
+ option3: true,
+ },
+)
+
+const functionPluginOptional = (app: App, options?: PluginOptions) => {}
+app.use(functionPluginOptional)
+app.use(functionPluginOptional, { option2: 2, option3: true })
+
+// type optional params
+const functionPluginOptional2: Plugin<[options?: PluginOptions]> = (
+ app,
+ options,
+) => {}
+app.use(functionPluginOptional2)
+app.use(functionPluginOptional2, { option2: 2, option3: true })
// vuetify usage
const key: string = ''
use<Options extends unknown[]>(
plugin: Plugin<Options>,
- ...options: Options
+ ...options: NoInfer<Options>
): this
- use<Options>(plugin: Plugin<Options>, options: Options): this
+ use<Options>(plugin: Plugin<Options>, options: NoInfer<Options>): this
mixin(mixin: ComponentOptions): this
component(name: string): Component | undefined
export type FunctionPlugin<Options = any[]> = PluginInstallFunction<Options> &
Partial<ObjectPlugin<Options>>
-export type Plugin<Options = any[]> =
- | FunctionPlugin<Options>
- | ObjectPlugin<Options>
+export type Plugin<
+ Options = any[],
+ // TODO: in next major Options extends unknown[] and remove P
+ P extends unknown[] = Options extends unknown[] ? Options : [Options],
+> = FunctionPlugin<P> | ObjectPlugin<P>
export function createAppContext(): AppContext {
return {