fix(types): correct scopedSlot types (#9131)

see #8946
This commit is contained in:
Kael 2018-12-04 12:31:39 +11:00 committed by Evan You
parent 0d7fb73925
commit 448ba65d2b
2 changed files with 15 additions and 6 deletions

View File

@ -1,5 +1,5 @@
import Vue, { VNode } from "../index";
import { AsyncComponent, ComponentOptions, FunctionalComponentOptions, Component } from "../index";
import { ComponentOptions, Component } from "../index";
import { CreateElement } from "../vue";
interface MyComponent extends Vue {
@ -297,6 +297,10 @@ Vue.component('component-with-scoped-slot', {
// named scoped slot as vnode data
item: (props: ScopedSlotProps) => [h('span', [props.msg])]
}
}),
h('child', {
// Passing down all slots from parent
scopedSlots: this.$scopedSlots
})
])
},
@ -315,13 +319,18 @@ Vue.component('component-with-scoped-slot', {
Vue.component('narrow-array-of-vnode-type', {
render (h): VNode {
const slot = this.$scopedSlots.default!({})
if (typeof slot !== 'string') {
if (typeof slot === 'string') {
return h('span', slot)
} else if (Array.isArray(slot)) {
const first = slot[0]
if (!Array.isArray(first) && typeof first !== 'string') {
return first;
return first
} else {
return h()
}
} else {
return slot
}
return h();
}
})

4
types/vnode.d.ts vendored
View File

@ -1,6 +1,6 @@
import { Vue } from "./vue";
export type ScopedSlot = (props: any) => VNodeChildrenArrayContents | string;
export type ScopedSlot = (props: any) => VNodeChildrenArrayContents | VNode | string;
export type VNodeChildren = VNodeChildrenArrayContents | [ScopedSlot] | string;
export interface VNodeChildrenArrayContents extends Array<VNode | string | VNodeChildrenArrayContents> {}
@ -34,7 +34,7 @@ export interface VNodeComponentOptions {
export interface VNodeData {
key?: string | number;
slot?: string;
scopedSlots?: { [key: string]: ScopedSlot };
scopedSlots?: { [key: string]: ScopedSlot | undefined };
ref?: string;
refInFor?: boolean;
tag?: string;