Skip to content

Commit

Permalink
fix(types): async Component types (vuejs#11906)
Browse files Browse the repository at this point in the history
* Update options.d.ts

* Create async-component-test.ts

* add generics to Component ad EsModuleComponent

* remove not needed , and ;

* revert unrelated changes

* revert unrelated changes

* revert unrelated changes

* revert unrelated changes

* optimize EsModuleImports

* Update async-component-test.ts
  • Loading branch information
mathe42 authored Jun 3, 2021
1 parent 80e7730 commit c52427b
Show file tree
Hide file tree
Showing 2 changed files with 52 additions and 7 deletions.
15 changes: 8 additions & 7 deletions types/options.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,10 @@ export type Component<Data=DefaultData<never>, Methods=DefaultMethods<never>, Co
| FunctionalComponentOptions<Props>
| ComponentOptions<never, Data, Methods, Computed, Props>

interface EsModuleComponent {
default: Component
}
type EsModule<T> = T | { default: T }

type ImportedComponent<Data=DefaultData<never>, Methods=DefaultMethods<never>, Computed=DefaultComputed, Props=DefaultProps>
= EsModule<Component<Data, Methods, Computed, Props>>

export type AsyncComponent<Data=DefaultData<never>, Methods=DefaultMethods<never>, Computed=DefaultComputed, Props=DefaultProps>
= AsyncComponentPromise<Data, Methods, Computed, Props>
Expand All @@ -23,12 +24,12 @@ export type AsyncComponent<Data=DefaultData<never>, Methods=DefaultMethods<never
export type AsyncComponentPromise<Data=DefaultData<never>, Methods=DefaultMethods<never>, Computed=DefaultComputed, Props=DefaultProps> = (
resolve: (component: Component<Data, Methods, Computed, Props>) => void,
reject: (reason?: any) => void
) => Promise<Component | EsModuleComponent> | void;
) => Promise<ImportedComponent<Data, Methods, Computed, Props>> | void;

export type AsyncComponentFactory<Data=DefaultData<never>, Methods=DefaultMethods<never>, Computed=DefaultComputed, Props=DefaultProps> = () => {
component: AsyncComponentPromise<Data, Methods, Computed, Props>;
loading?: Component | EsModuleComponent;
error?: Component | EsModuleComponent;
component: Promise<ImportedComponent<Data, Methods, Computed, Props>>;
loading?: ImportedComponent;
error?: ImportedComponent;
delay?: number;
timeout?: number;
}
Expand Down
44 changes: 44 additions & 0 deletions types/test/async-component-test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
import Vue, { AsyncComponent, Component } from "../index";

const a: AsyncComponent = () => ({
component: new Promise<Component>((res, rej) => {
res({ template: "" })
})
})

const b: AsyncComponent = () => ({
// @ts-expect-error component has to be a Promise that resolves to a component
component: () =>
new Promise<Component>((res, rej) => {
res({ template: "" })
})
})

const c: AsyncComponent = () =>
new Promise<Component>((res, rej) => {
res({
template: ""
})
})

const d: AsyncComponent = () =>
new Promise<{ default: Component }>((res, rej) => {
res({
default: {
template: ""
}
})
})

const e: AsyncComponent = () => ({
component: new Promise<{ default: Component }>((res, rej) => {
res({
default: {
template: ""
}
})
})
})

// Test that Vue.component accepts any AsyncComponent
Vue.component("async-compponent1", a)

0 comments on commit c52427b

Please sign in to comment.