Skip to content

Commit fc13423

Browse files
fix(types): contravariant generic default in ComponentOption
1 parent 400aa65 commit fc13423

File tree

2 files changed

+20
-7
lines changed

2 files changed

+20
-7
lines changed

types/options.d.ts

+4-3
Original file line numberDiff line numberDiff line change
@@ -6,16 +6,17 @@ type Constructor = {
66
}
77

88
// we don't support infer props in async component
9-
export type Component<Data=DefaultData<Vue>, Methods=DefaultMethods<Vue>, Computed=DefaultComputed, Props=DefaultProps> =
9+
// N.B. ComponentOptions<V> is contravariant, the default generic should be bottom type
10+
export type Component<Data=DefaultData<never>, Methods=DefaultMethods<never>, Computed=DefaultComputed, Props=DefaultProps> =
1011
| typeof Vue
1112
| FunctionalComponentOptions<Props>
12-
| ComponentOptions<Vue, Data, Methods, Computed, Props>
13+
| ComponentOptions<never, Data, Methods, Computed, Props>
1314

1415
interface EsModuleComponent {
1516
default: Component
1617
}
1718

18-
export type AsyncComponent<Data=DefaultData<Vue>, Methods=DefaultMethods<Vue>, Computed=DefaultComputed, Props=DefaultProps> = (
19+
export type AsyncComponent<Data=DefaultData<never>, Methods=DefaultMethods<never>, Computed=DefaultComputed, Props=DefaultProps> = (
1920
resolve: (component: Component<Data, Methods, Computed, Props>) => void,
2021
reject: (reason?: any) => void
2122
) => Promise<Component | EsModuleComponent> | void;

types/test/options-test.ts

+16-4
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,23 @@
11
import Vue, { VNode } from "../index";
2-
import { AsyncComponent, ComponentOptions, FunctionalComponentOptions } from "../index";
2+
import { AsyncComponent, ComponentOptions, FunctionalComponentOptions, Component } from "../index";
33
import { CreateElement } from "../vue";
44

5-
interface Component extends Vue {
5+
interface MyComponent extends Vue {
66
a: number;
77
}
88

9+
const option: ComponentOptions<MyComponent> = {
10+
data() {
11+
return {
12+
a: 123
13+
}
14+
}
15+
}
16+
17+
// contravariant generic should use never
18+
const anotherOption: ComponentOptions<never> = option
19+
const componentType: Component = option
20+
921
Vue.component('sub-component', {
1022
components: {
1123
a: Vue.component(""),
@@ -41,10 +53,10 @@ Vue.component('string-prop', {
4153
});
4254

4355
class User {
44-
private u: number
56+
private u = 1
4557
}
4658
class Cat {
47-
private u: number
59+
private u = 1
4860
}
4961

5062
Vue.component('union-prop', {

0 commit comments

Comments
 (0)