refactor(types): use stricter settings

fix #847
This commit is contained in:
Evan You
2020-03-23 11:08:22 -04:00
parent b3890a93e3
commit b8c1be18f3
27 changed files with 385 additions and 381 deletions

View File

@@ -17,8 +17,9 @@ import { toRaw } from '@vue/reactivity'
import { callWithAsyncErrorHandling, ErrorCodes } from '../errorHandling'
import { ShapeFlags } from '@vue/shared'
import { onBeforeUnmount, onMounted } from '../apiLifecycle'
import { RendererElement } from '../renderer'
export interface BaseTransitionProps {
export interface BaseTransitionProps<HostElement = RendererElement> {
mode?: 'in-out' | 'out-in' | 'default'
appear?: boolean
@@ -32,25 +33,25 @@ export interface BaseTransitionProps {
// Hooks. Using camel case for easier usage in render functions & JSX.
// In templates these can be written as @before-enter="xxx" as prop names
// are camelized.
onBeforeEnter?: (el: any) => void
onEnter?: (el: any, done: () => void) => void
onAfterEnter?: (el: any) => void
onEnterCancelled?: (el: any) => void
onBeforeEnter?: (el: HostElement) => void
onEnter?: (el: HostElement, done: () => void) => void
onAfterEnter?: (el: HostElement) => void
onEnterCancelled?: (el: HostElement) => void
// leave
onBeforeLeave?: (el: any) => void
onLeave?: (el: any, done: () => void) => void
onAfterLeave?: (el: any) => void
onLeaveCancelled?: (el: any) => void // only fired in persisted mode
onBeforeLeave?: (el: HostElement) => void
onLeave?: (el: HostElement, done: () => void) => void
onAfterLeave?: (el: HostElement) => void
onLeaveCancelled?: (el: HostElement) => void // only fired in persisted mode
}
export interface TransitionHooks {
persisted: boolean
beforeEnter(el: object): void
enter(el: object): void
leave(el: object, remove: () => void): void
beforeEnter(el: RendererElement): void
enter(el: RendererElement): void
leave(el: RendererElement, remove: () => void): void
afterLeave?(): void
delayLeave?(
el: object,
el: RendererElement,
earlyRemove: () => void,
delayedLeave: () => void
): void
@@ -222,7 +223,7 @@ if (__DEV__) {
// also to avoid inline import() in generated d.ts files
export const BaseTransition = (BaseTransitionImpl as any) as {
new (): {
$props: BaseTransitionProps
$props: BaseTransitionProps<any>
}
}
@@ -254,7 +255,7 @@ export function resolveTransitionHooks(
onLeave,
onAfterLeave,
onLeaveCancelled
}: BaseTransitionProps,
}: BaseTransitionProps<any>,
state: TransitionState,
instance: ComponentInternalInstance
): TransitionHooks {
@@ -286,10 +287,10 @@ export function resolveTransitionHooks(
if (
leavingVNode &&
isSameVNodeType(vnode, leavingVNode) &&
leavingVNode.el._leaveCb
leavingVNode.el!._leaveCb
) {
// force early removal (not cancelled)
leavingVNode.el._leaveCb()
leavingVNode.el!._leaveCb()
}
callHook(onBeforeEnter, [el])
},

View File

@@ -17,7 +17,9 @@ import {
RendererInternals,
queuePostRenderEffect,
invokeHooks,
MoveType
MoveType,
RendererElement,
RendererNode
} from '../renderer'
import { setTransitionHooks } from './BaseTransition'
@@ -36,7 +38,11 @@ type Keys = Set<CacheKey>
export interface KeepAliveSink {
renderer: RendererInternals
parentSuspense: SuspenseBoundary | null
activate: (vnode: VNode, container: object, anchor: object | null) => void
activate: (
vnode: VNode,
container: RendererElement,
anchor: RendererNode | null
) => void
deactivate: (vnode: VNode) => void
}

View File

@@ -1,6 +1,11 @@
import { ComponentInternalInstance } from '../component'
import { SuspenseBoundary } from './Suspense'
import { RendererInternals, MoveType } from '../renderer'
import {
RendererInternals,
MoveType,
RendererElement,
RendererNode
} from '../renderer'
import { VNode, VNodeArrayChildren, VNodeProps } from '../vnode'
import { isString, ShapeFlags, PatchFlags } from '@vue/shared'
import { warn } from '../warning'
@@ -16,8 +21,8 @@ export const PortalImpl = {
process(
n1: VNode | null,
n2: VNode,
container: object,
anchor: object | null,
container: RendererElement,
anchor: RendererNode | null,
parentComponent: ComponentInternalInstance | null,
parentSuspense: SuspenseBoundary | null,
isSVG: boolean,

View File

@@ -2,7 +2,13 @@ import { VNode, normalizeVNode, VNodeChild, VNodeProps } from '../vnode'
import { isFunction, isArray, ShapeFlags } from '@vue/shared'
import { ComponentInternalInstance, handleSetupResult } from '../component'
import { Slots } from '../componentSlots'
import { RendererInternals, MoveType, SetupRenderEffectFn } from '../renderer'
import {
RendererInternals,
MoveType,
SetupRenderEffectFn,
RendererNode,
RendererElement
} from '../renderer'
import { queuePostFlushCb, queueJob } from '../scheduler'
import { updateHOCHostEl } from '../componentRenderUtils'
import { pushWarningContext, popWarningContext } from '../warning'
@@ -27,8 +33,8 @@ export const SuspenseImpl = {
process(
n1: VNode | null,
n2: VNode,
container: object,
anchor: object | null,
container: RendererElement,
anchor: RendererNode | null,
parentComponent: ComponentInternalInstance | null,
parentSuspense: SuspenseBoundary | null,
isSVG: boolean,
@@ -73,8 +79,8 @@ export const Suspense = ((__FEATURE_SUSPENSE__
function mountSuspense(
n2: VNode,
container: object,
anchor: object | null,
container: RendererElement,
anchor: RendererNode | null,
parentComponent: ComponentInternalInstance | null,
parentSuspense: SuspenseBoundary | null,
isSVG: boolean,
@@ -132,8 +138,8 @@ function mountSuspense(
function patchSuspense(
n1: VNode,
n2: VNode,
container: object,
anchor: object | null,
container: RendererElement,
anchor: RendererNode | null,
parentComponent: ComponentInternalInstance | null,
isSVG: boolean,
optimized: boolean,
@@ -190,21 +196,17 @@ function patchSuspense(
suspense.fallbackTree = fallback
}
export interface SuspenseBoundary<
HostNode = any,
HostElement = any,
HostVNode = VNode<HostNode, HostElement>
> {
vnode: HostVNode
parent: SuspenseBoundary<HostNode, HostElement> | null
export interface SuspenseBoundary {
vnode: VNode
parent: SuspenseBoundary | null
parentComponent: ComponentInternalInstance | null
isSVG: boolean
optimized: boolean
container: HostElement
hiddenContainer: HostElement
anchor: HostNode | null
subTree: HostVNode
fallbackTree: HostVNode
container: RendererElement
hiddenContainer: RendererElement
anchor: RendererNode | null
subTree: VNode
fallbackTree: VNode
deps: number
isHydrating: boolean
isResolved: boolean
@@ -212,30 +214,31 @@ export interface SuspenseBoundary<
effects: Function[]
resolve(): void
recede(): void
move(container: HostElement, anchor: HostNode | null, type: MoveType): void
next(): HostNode | null
move(
container: RendererElement,
anchor: RendererNode | null,
type: MoveType
): void
next(): RendererNode | null
registerDep(
instance: ComponentInternalInstance,
setupRenderEffect: SetupRenderEffectFn<HostNode, HostElement>
): void
unmount(
parentSuspense: SuspenseBoundary<HostNode, HostElement> | null,
doRemove?: boolean
setupRenderEffect: SetupRenderEffectFn
): void
unmount(parentSuspense: SuspenseBoundary | null, doRemove?: boolean): void
}
function createSuspenseBoundary<HostNode, HostElement>(
vnode: VNode<HostNode, HostElement>,
parent: SuspenseBoundary<HostNode, HostElement> | null,
function createSuspenseBoundary(
vnode: VNode,
parent: SuspenseBoundary | null,
parentComponent: ComponentInternalInstance | null,
container: HostElement,
hiddenContainer: HostElement,
anchor: HostNode | null,
container: RendererElement,
hiddenContainer: RendererElement,
anchor: RendererNode | null,
isSVG: boolean,
optimized: boolean,
rendererInternals: RendererInternals<HostNode, HostElement>,
rendererInternals: RendererInternals,
isHydrating = false
): SuspenseBoundary<HostNode, HostElement> {
): SuspenseBoundary {
const {
p: patch,
m: move,
@@ -250,7 +253,7 @@ function createSuspenseBoundary<HostNode, HostElement>(
: suspense.fallbackTree
const { content, fallback } = normalizeSuspenseChildren(vnode)
const suspense: SuspenseBoundary<HostNode, HostElement> = {
const suspense: SuspenseBoundary = {
vnode,
parent,
parentComponent,
@@ -430,7 +433,7 @@ function createSuspenseBoundary<HostNode, HostElement>(
// placeholder.
hydratedEl
? parentNode(hydratedEl)!
: parentNode(instance.subTree.el)!,
: parentNode(instance.subTree.el!)!,
// anchor will not be used if this is hydration, so only need to
// consider the comment placeholder case.
hydratedEl ? null : next(instance.subTree),
@@ -484,7 +487,7 @@ function hydrateSuspense(
vnode,
parentSuspense,
parentComponent,
node.parentNode,
node.parentNode!,
document.createElement('div'),
null,
isSVG,