From 9d6783053cb8a8569228430655ef29cd80462050 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9C=88=E8=BF=B7=E6=B4=A5=E6=B8=A1?= Date: Sat, 5 Oct 2019 22:09:34 +0800 Subject: [PATCH] types: simplify types (#104) --- packages/runtime-core/src/apiApp.ts | 4 +- .../runtime-core/src/apiCreateComponent.ts | 2 +- packages/runtime-core/src/component.ts | 13 ++--- packages/runtime-core/src/componentProps.ts | 6 +- packages/runtime-core/src/componentProxy.ts | 2 +- .../runtime-core/src/componentRenderUtils.ts | 8 +-- packages/runtime-core/src/createRenderer.ts | 58 ++++++------------- packages/runtime-core/src/directives.ts | 6 +- packages/runtime-core/src/errorHandling.ts | 2 +- .../runtime-core/src/helpers/resolveAssets.ts | 9 ++- packages/runtime-core/src/scheduler.ts | 4 +- packages/runtime-core/src/warning.ts | 7 +-- 12 files changed, 50 insertions(+), 71 deletions(-) diff --git a/packages/runtime-core/src/apiApp.ts b/packages/runtime-core/src/apiApp.ts index 584362be..99ab5b78 100644 --- a/packages/runtime-core/src/apiApp.ts +++ b/packages/runtime-core/src/apiApp.ts @@ -1,4 +1,4 @@ -import { Component, Data, ComponentInternalInstance } from './component' +import { Component, Data } from './component' import { ComponentOptions } from './apiOptions' import { ComponentPublicInstance } from './componentProxy' import { Directive } from './directives' @@ -142,7 +142,7 @@ export function createAppAPI( vnode.appContext = context render(vnode, rootContainer) isMounted = true - return (vnode.component as ComponentInternalInstance).renderProxy + return vnode.component!.renderProxy } else if (__DEV__) { warn( `App has already been mounted. Create a new app instance instead.` diff --git a/packages/runtime-core/src/apiCreateComponent.ts b/packages/runtime-core/src/apiCreateComponent.ts index 45a3ca6d..5752da8f 100644 --- a/packages/runtime-core/src/apiCreateComponent.ts +++ b/packages/runtime-core/src/apiCreateComponent.ts @@ -77,5 +77,5 @@ export function createComponent< // implementation, close to no-op export function createComponent(options: any) { - return isFunction(options) ? { setup: options } : (options as any) + return isFunction(options) ? { setup: options } : options } diff --git a/packages/runtime-core/src/component.ts b/packages/runtime-core/src/component.ts index 570092dc..75a2876a 100644 --- a/packages/runtime-core/src/component.ts +++ b/packages/runtime-core/src/component.ts @@ -225,7 +225,7 @@ export function setupStatefulComponent( ) { const Component = instance.type as ComponentOptions // 1. create render proxy - instance.renderProxy = new Proxy(instance, PublicInstanceProxyHandlers) as any + instance.renderProxy = new Proxy(instance, PublicInstanceProxyHandlers) // 2. create props proxy // the propsProxy is a reactive AND readonly proxy to the actual props. // it will be updated in resolveProps() on updates before render @@ -255,7 +255,7 @@ export function setupStatefulComponent( if (__FEATURE_SUSPENSE__) { // async setup returned Promise. // bail here and wait for re-entry. - instance.asyncDep = setupResult as Promise + instance.asyncDep = setupResult } else if (__DEV__) { warn( `setup() returned a Promise, but the version of Vue you are using ` + @@ -358,10 +358,9 @@ export const SetupProxySymbol = Symbol() const SetupProxyHandlers: { [key: string]: ProxyHandler } = {} ;['attrs', 'slots', 'refs'].forEach((type: string) => { SetupProxyHandlers[type] = { - get: (instance, key) => (instance[type] as any)[key], - has: (instance, key) => - key === SetupProxySymbol || key in (instance[type] as any), - ownKeys: instance => Reflect.ownKeys(instance[type] as any), + get: (instance, key) => instance[type][key], + has: (instance, key) => key === SetupProxySymbol || key in instance[type], + ownKeys: instance => Reflect.ownKeys(instance[type]), // this is necessary for ownKeys to work properly getOwnPropertyDescriptor: (instance, key) => Reflect.getOwnPropertyDescriptor(instance[type], key), @@ -379,6 +378,6 @@ function createSetupContext(instance: ComponentInternalInstance): SetupContext { slots: new Proxy(instance, SetupProxyHandlers.slots), refs: new Proxy(instance, SetupProxyHandlers.refs), emit: instance.emit - } as any + } return __DEV__ ? Object.freeze(context) : context } diff --git a/packages/runtime-core/src/componentProps.ts b/packages/runtime-core/src/componentProps.ts index fad4d78b..4f32d3c6 100644 --- a/packages/runtime-core/src/componentProps.ts +++ b/packages/runtime-core/src/componentProps.ts @@ -96,7 +96,7 @@ export function resolveProps( _options: ComponentPropsOptions | void ) { const hasDeclaredProps = _options != null - const options = normalizePropsOptions(_options) as NormalizedPropsOptions + const options = normalizePropsOptions(_options)! if (!rawProps && !hasDeclaredProps) { return } @@ -196,9 +196,9 @@ const normalizationMap = new WeakMap() function normalizePropsOptions( raw: ComponentPropsOptions | void -): NormalizedPropsOptions | void { +): NormalizedPropsOptions | null { if (!raw) { - return + return null } if (normalizationMap.has(raw)) { return normalizationMap.get(raw) diff --git a/packages/runtime-core/src/componentProxy.ts b/packages/runtime-core/src/componentProxy.ts index 39ee392c..b93e5aba 100644 --- a/packages/runtime-core/src/componentProxy.ts +++ b/packages/runtime-core/src/componentProxy.ts @@ -38,7 +38,7 @@ export const PublicInstanceProxyHandlers = { return renderContext[key] } else if (hasOwn(props, key)) { // return the value from propsProxy for ref unwrapping and readonly - return (propsProxy as any)[key] + return propsProxy![key] } else { // TODO simplify this? switch (key) { diff --git a/packages/runtime-core/src/componentRenderUtils.ts b/packages/runtime-core/src/componentRenderUtils.ts index f2973adb..554430c5 100644 --- a/packages/runtime-core/src/componentRenderUtils.ts +++ b/packages/runtime-core/src/componentRenderUtils.ts @@ -29,7 +29,7 @@ export function renderComponentRoot( currentRenderingInstance = instance try { if (vnode.shapeFlag & ShapeFlags.STATEFUL_COMPONENT) { - result = normalizeVNode((instance.render as Function).call(renderProxy)) + result = normalizeVNode(instance.render!.call(renderProxy)) } else { // functional const render = Component as FunctionalComponent @@ -66,12 +66,12 @@ export function shouldUpdateComponent( } if (patchFlag & PatchFlags.FULL_PROPS) { // presence of this flag indicates props are always non-null - return hasPropsChanged(prevProps as Data, nextProps as Data) + return hasPropsChanged(prevProps!, nextProps!) } else if (patchFlag & PatchFlags.PROPS) { - const dynamicProps = nextVNode.dynamicProps as string[] + const dynamicProps = nextVNode.dynamicProps! for (let i = 0; i < dynamicProps.length; i++) { const key = dynamicProps[i] - if ((nextProps as any)[key] !== (prevProps as any)[key]) { + if (nextProps![key] !== prevProps![key]) { return true } } diff --git a/packages/runtime-core/src/createRenderer.ts b/packages/runtime-core/src/createRenderer.ts index 8829b738..83d98f18 100644 --- a/packages/runtime-core/src/createRenderer.ts +++ b/packages/runtime-core/src/createRenderer.ts @@ -60,12 +60,8 @@ function createDevEffectOptions( ): ReactiveEffectOptions { return { scheduler: queueJob, - onTrack: instance.rtc - ? e => invokeHooks(instance.rtc as Function[], e) - : void 0, - onTrigger: instance.rtg - ? e => invokeHooks(instance.rtg as Function[], e) - : void 0 + onTrack: instance.rtc ? e => invokeHooks(instance.rtc!, e) : void 0, + onTrigger: instance.rtg ? e => invokeHooks(instance.rtg!, e) : void 0 } } @@ -449,7 +445,7 @@ export function createRenderer< // bail out and go through a full diff because we need to unset the old key if (patchFlag & PatchFlags.PROPS) { // if the flag is present then dynamicProps must be non-null - const propsToUpdate = n2.dynamicProps as string[] + const propsToUpdate = n2.dynamicProps! for (let i = 0; i < propsToUpdate.length; i++) { const key = propsToUpdate[i] const prev = oldProps[key] @@ -495,7 +491,7 @@ export function createRenderer< if (dynamicChildren != null) { // children fast path - const olddynamicChildren = n1.dynamicChildren as HostVNode[] + const olddynamicChildren = n1.dynamicChildren! for (let i = 0; i < dynamicChildren.length; i++) { patch( olddynamicChildren[i], @@ -579,12 +575,10 @@ export function createRenderer< isSVG: boolean, optimized: boolean ) { - const fragmentStartAnchor = (n2.el = n1 - ? n1.el - : hostCreateComment('')) as HostNode + const fragmentStartAnchor = (n2.el = n1 ? n1.el : hostCreateComment(''))! const fragmentEndAnchor = (n2.anchor = n1 ? n1.anchor - : hostCreateComment('')) as HostNode + : hostCreateComment(''))! if (n1 == null) { hostInsert(fragmentStartAnchor, container, anchor) hostInsert(fragmentEndAnchor, container, anchor) @@ -647,7 +641,7 @@ export function createRenderer< } } else { // update content - const target = (n2.target = n1.target) as HostElement + const target = (n2.target = n1.target)! if (patchFlag === PatchFlags.TEXT) { hostSetElementText(target, children as string) } else if (!optimized) { @@ -783,7 +777,7 @@ export function createRenderer< isSVG: boolean, optimized: boolean ) { - const suspense = (n2.suspense = n1.suspense) as HostSuspsenseBoundary + const suspense = (n2.suspense = n1.suspense)! suspense.vnode = n2 const { content, fallback } = normalizeSuspenseChildren(n2) const oldSubTree = suspense.subTree @@ -959,8 +953,7 @@ export function createRenderer< isSVG ) } else { - const instance = (n2.component = - n1.component) as ComponentInternalInstance + const instance = (n2.component = n1.component)! if (shouldUpdateComponent(n1, n2, optimized)) { if ( @@ -991,12 +984,7 @@ export function createRenderer< } } if (n2.ref !== null && parentComponent !== null) { - setRef( - n2.ref, - n1 && n1.ref, - parentComponent, - (n2.component as ComponentInternalInstance).renderProxy - ) + setRef(n2.ref, n1 && n1.ref, parentComponent, n2.component!.renderProxy) } } @@ -1601,7 +1589,7 @@ export function createRenderer< return } if (__FEATURE_SUSPENSE__ && vnode.type === Suspense) { - const suspense = vnode.suspense as SuspenseBoundary + const suspense = vnode.suspense! move( suspense.isResolved ? suspense.subTree : suspense.fallbackTree, container, @@ -1611,14 +1599,14 @@ export function createRenderer< return } if (vnode.type === Fragment) { - hostInsert(vnode.el as HostNode, container, anchor) + hostInsert(vnode.el!, container, anchor) const children = vnode.children as HostVNode[] for (let i = 0; i < children.length; i++) { move(children[i], container, anchor) } - hostInsert(vnode.anchor as HostNode, container, anchor) + hostInsert(vnode.anchor!, container, anchor) } else { - hostInsert(vnode.el as HostNode, container, anchor) + hostInsert(vnode.el!, container, anchor) } } @@ -1677,7 +1665,7 @@ export function createRenderer< } if (doRemove) { - hostRemove(vnode.el as HostNode) + hostRemove(vnode.el!) if (anchor != null) hostRemove(anchor) } @@ -1742,19 +1730,9 @@ export function createRenderer< doRemove?: boolean ) { suspense.isUnmounted = true - unmount( - suspense.subTree as HostVNode, - parentComponent, - parentSuspense, - doRemove - ) + unmount(suspense.subTree, parentComponent, parentSuspense, doRemove) if (!suspense.isResolved) { - unmount( - suspense.fallbackTree as HostVNode, - parentComponent, - parentSuspense, - doRemove - ) + unmount(suspense.fallbackTree, parentComponent, parentSuspense, doRemove) } } @@ -1784,7 +1762,7 @@ export function createRenderer< suspense.isResolved ? suspense.subTree : suspense.fallbackTree ) } - return hostNextSibling((anchor || el) as HostNode) + return hostNextSibling((anchor || el)!) } function setRef( diff --git a/packages/runtime-core/src/directives.ts b/packages/runtime-core/src/directives.ts index 39aa7d6e..09caf36b 100644 --- a/packages/runtime-core/src/directives.ts +++ b/packages/runtime-core/src/directives.ts @@ -55,13 +55,13 @@ function applyDirective( arg?: string, modifiers?: DirectiveModifiers ) { - let valueCacheForDir = valueCache.get(directive) as WeakMap + let valueCacheForDir = valueCache.get(directive)! if (!valueCacheForDir) { valueCacheForDir = new WeakMap() valueCache.set(directive, valueCacheForDir) } for (const key in directive) { - const hook = directive[key as keyof Directive] as DirectiveHook + const hook = directive[key as keyof Directive]! const hookKey = `vnode` + key[0].toUpperCase() + key.slice(1) const vnodeHook = (vnode: VNode, prevVNode: VNode | null) => { let oldValue @@ -85,7 +85,7 @@ function applyDirective( } const existing = props[hookKey] props[hookKey] = existing - ? [].concat(existing as any, vnodeHook as any) + ? [].concat(existing, vnodeHook as any) : vnodeHook } } diff --git a/packages/runtime-core/src/errorHandling.ts b/packages/runtime-core/src/errorHandling.ts index a5c9213e..26a99a26 100644 --- a/packages/runtime-core/src/errorHandling.ts +++ b/packages/runtime-core/src/errorHandling.ts @@ -72,7 +72,7 @@ export function callWithAsyncErrorHandling( ) { const res = callWithErrorHandling(fn, instance, type, args) if (res != null && !res._isVue && typeof res.then === 'function') { - ;(res as Promise).catch(err => { + res.catch((err: any) => { handleError(err, instance, type) }) } diff --git a/packages/runtime-core/src/helpers/resolveAssets.ts b/packages/runtime-core/src/helpers/resolveAssets.ts index fd6fdd5d..b129d552 100644 --- a/packages/runtime-core/src/helpers/resolveAssets.ts +++ b/packages/runtime-core/src/helpers/resolveAssets.ts @@ -5,13 +5,18 @@ import { camelize, capitalize } from '@vue/shared' import { warn } from '../warning' export function resolveComponent(name: string): Component | undefined { - return resolveAsset('components', name) as any + return resolveAsset('components', name) } export function resolveDirective(name: string): Directive | undefined { - return resolveAsset('directives', name) as any + return resolveAsset('directives', name) } +// overload 1: components +function resolveAsset(type: 'components', name: string): Component | undefined +// overload 2: directives +function resolveAsset(type: 'directives', name: string): Directive | undefined + function resolveAsset(type: 'components' | 'directives', name: string) { const instance = currentRenderingInstance || currentInstance if (instance) { diff --git a/packages/runtime-core/src/scheduler.ts b/packages/runtime-core/src/scheduler.ts index 3a73af95..4c9f452a 100644 --- a/packages/runtime-core/src/scheduler.ts +++ b/packages/runtime-core/src/scheduler.ts @@ -53,11 +53,11 @@ function flushJobs(seenJobs?: JobCountMap) { } while ((job = queue.shift())) { if (__DEV__) { - const seen = seenJobs as JobCountMap + const seen = seenJobs! if (!seen.has(job)) { seen.set(job, 1) } else { - const count = seen.get(job) as number + const count = seen.get(job)! if (count > RECURSION_LIMIT) { throw new Error( 'Maximum recursive updates exceeded. ' + diff --git a/packages/runtime-core/src/warning.ts b/packages/runtime-core/src/warning.ts index 24e6d9c7..4aede5e8 100644 --- a/packages/runtime-core/src/warning.ts +++ b/packages/runtime-core/src/warning.ts @@ -77,7 +77,7 @@ function getComponentTrace(): ComponentTraceStack { recurseCount: 0 }) } - const parentInstance: ComponentInternalInstance | null = (currentVNode.component as ComponentInternalInstance) + const parentInstance: ComponentInternalInstance | null = currentVNode.component! .parent currentVNode = parentInstance && parentInstance.vnode } @@ -107,10 +107,7 @@ function formatTraceEntry( recurseCount > 0 ? `... (${recurseCount} recursive calls)` : `` const open = padding + `<${formatComponentName(vnode)}` const close = `>` + postfix - const rootLabel = - (vnode.component as ComponentInternalInstance).parent == null - ? `(Root)` - : `` + const rootLabel = vnode.component!.parent == null ? `(Root)` : `` return vnode.props ? [open, ...formatProps(vnode.props), close, rootLabel] : [open + close, rootLabel]