Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

types: add AsyncComponentFactory type #8438

Merged
merged 2 commits into from
Dec 5, 2018

Conversation

kiyui
Copy link
Contributor

@kiyui kiyui commented Jun 30, 2018

What kind of change does this PR introduce? (check at least one)

  • Bugfix
  • Feature
  • Code style update
  • Refactor
  • Build-related changes
  • Other, please describe: Typescript

Does this PR introduce a breaking change? (check one)

  • Yes
  • No

If yes, please describe the impact and migration path for existing applications:

The PR fulfills these requirements:

If adding a new feature, the PR's description includes:

  • A convincing reason for adding this feature (to avoid wasting your time, it's best to open a suggestion issue first and wait for approval before working on it)

Other information:

The current type definition for ComponentOptions does not have a definition for async component factories and as such causes errors when using the syntax with vue-class-component.

@FeliciousX
Copy link

👍 need this. quite annoying I can't use async component with vue-class-component .

@Component({
  components: {
    HelloComponent
  }
})

this works..
BUT

@Component({
  components: {
    'dynamic-component': () => ({
      component : import( 'from/some/index.vue' ),
      loading : LoadingComponent    
    })
  }
})

this currently throws a type error. Does this PR fix this? :D :D :D :D

@FeliciousX
Copy link

to make it work i had to do

@Component<any>({ // <-- this
  components: {
    'dynamic-component': () => ({
      component : import( 'from/some/index.vue' ),
      loading : LoadingComponent    
    })
  }
})

:/

@kiyui
Copy link
Contributor Author

kiyui commented Jul 10, 2018

@FeliciousX yes, this should fix this.

@@ -86,7 +94,7 @@ export interface ComponentOptions<
errorCaptured?(err: Error, vm: Vue, info: string): boolean | void;

directives?: { [key: string]: DirectiveFunction | DirectiveOptions };
components?: { [key: string]: Component<any, any, any, any> | AsyncComponent<any, any, any, any> };
components?: { [key: string]: Component<any, any, any, any> | AsyncComponent<any, any, any, any> | AsyncComponentFactory<any, any, any, any> };
Copy link

@backbone87 backbone87 Aug 30, 2018

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This overload isnt sufficient. At least createElement needs overloads too.

I think it would be better to extend the AsyncComponent type directly:

export type AsyncComponent<Data=DefaultData<never>, Methods=DefaultMethods<never>, Computed=DefaultComputed, Props=DefaultProps>
  = AsyncComponentPromise<Data, Methods, Computed, Props>
  | AsyncComponentFactory<Data, Methods, Computed, Props>

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;

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;
  delay?: number;
  timeout?: number;
}

@yyx990803 yyx990803 merged commit dfaf9e2 into vuejs:dev Dec 5, 2018
@kiyui kiyui deleted the async-component-factory-type branch December 6, 2018 04:11
f2009 pushed a commit to f2009/vue that referenced this pull request Jan 25, 2019
aJean pushed a commit to aJean/vue that referenced this pull request Aug 19, 2020
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants