/** VNode 的 type 字段允许的类型 */ type VNodeTypes = string | symbol | ((props: any) => any); /** VNode key */ type VNodeKey = string | number | null; /** VNode 描述对象 */ interface VNode { $$typeof: symbol; type: Type; key: VNodeKey; ref: any; props: Record | null; /** 指向真实 DOM(渲染后挂载) */ el?: Node | null; } /** 组件类型:defineComponent 产物({ __setup } + call signature),props 泛型化 */ type ComponentType

= { __setup: (props: P, ctx?: any) => any; } & ((props: P) => any); /** 从组件类型推导 props:取 __setup 的第一个参数 */ type PropsOf = T extends { __setup: (props: infer P) => any; } ? P : T extends (props: infer P) => any ? P : {}; /** * ref 最小结构(与 core reactivity/ref.ts 结构互认;jsx 包保持零依赖底座, * 不 import core——core 的 Ref/ComputedRef 均满足本结构,可互相赋值)。 */ interface Ref { value: T; readonly __v_isRef?: true; } /** * 值或 ref——JSX 属性(props/children/原生元素属性)接受解包前(Ref)与 * 解包后(值)两种形态,运行时由 jsxFactory.unwrapProps 统一顶层解包。 */ type MaybeRef = T | Ref; /** * 组件/元素 props 的 JSX 消费形态:顶层属性接受 Ref。 * 与运行时 unwrapProps 一致:只解包顶层,嵌套对象内不解包。 * type Props = { count: number } * MaybeRefProps = { count: number | Ref } */ type MaybeRefProps

= { [K in keyof P]: MaybeRef; }; /** * 原生元素属性 MaybeRef 化(IntrinsicElements 的元素类型统一包装): * TS 对 intrinsic 元素()的 props 检查直接读 JSX.IntrinsicElements[K], * 不经 jsx 函数签名——因此元素属性类型本身必须接受 Ref。 * MaybeRefAttrs = { value: string | number | readonly string[] | Ref<...>, ... } */ type MaybeRefAttrs> = { [K in keyof A]: MaybeRef; }; /** children 原子节点(不含 ref、不含数组——两者单独表达,精确对齐运行时解包边界) */ type VNodeChildLeaf = VNode | string | number | boolean | null | undefined | void; /** 单个子节点:顶层允许 ref(jsxFactory unwrapProps 顶层解包 → 值/文本) */ type VNodeChild = VNodeChildLeaf | Ref; /** * children:原子节点 | 顶层 ref | 递归数组。 * 数组内不允许 ref:运行时只解包 children 顶层,数组内 ref 不会解包、 * 会作为无效 vnode 挂载失败——编译期即拦截(与运行时行为精确一致)。 */ type VNodeChildren = VNodeChildLeaf | Ref | VNodeArrayChildren; /** 数组子节点:元素为原子节点或嵌套数组(不含 ref) */ type VNodeArrayChildren = Array; /** 组件 setup 返回的 render 函数类型 */ type LazyVNode = () => VNode; /** 表单事件 — target 上带 value/checked 等输入属性 */ interface FormEvent extends Event { target: EventTarget & { value: string; checked: boolean; }; } /** * 事件处理器通用形状(原生 DOM 事件,无合成事件包装)。 * 用「方法双变」技巧(bivarianceHack,对齐 React):TS 函数参数逆变检查下 * `(e: MouseEvent) => void` 不能赋给 `(e: Event) => void`;方法参数按双变 * 检查,放宽容器的赋值方向、保留 E 的精确类型(窄事件 handler 可赋给宽事件 * prop;运行时 DOM 派发保证事件与声明元素匹配,实践中安全)。 */ type EventHandler = { bivarianceHack(event: E): void; }['bivarianceHack']; interface DOMAttributes { onClick?: EventHandler; onDblClick?: EventHandler; onMouseDown?: EventHandler; onMouseUp?: EventHandler; onMouseMove?: EventHandler; onMouseEnter?: EventHandler; onMouseLeave?: EventHandler; onMouseOver?: EventHandler; onMouseOut?: EventHandler; onContextMenu?: EventHandler; onKeyDown?: EventHandler; onKeyUp?: EventHandler; onKeyPress?: EventHandler; onFocus?: EventHandler; onBlur?: EventHandler; onFocusIn?: EventHandler; onFocusOut?: EventHandler; onInput?: EventHandler; onChange?: EventHandler; onSubmit?: EventHandler; onReset?: EventHandler; onInvalid?: EventHandler; onSelect?: EventHandler; onSearch?: EventHandler; onCopy?: EventHandler; onCut?: EventHandler; onPaste?: EventHandler; onDrag?: EventHandler; onDragStart?: EventHandler; onDragEnd?: EventHandler; onDragOver?: EventHandler; onDragEnter?: EventHandler; onDragLeave?: EventHandler; onDrop?: EventHandler; onPointerDown?: EventHandler; onPointerUp?: EventHandler; onPointerMove?: EventHandler; onPointerEnter?: EventHandler; onPointerLeave?: EventHandler; onTouchStart?: EventHandler; onTouchEnd?: EventHandler; onTouchMove?: EventHandler; onTouchCancel?: EventHandler; onScroll?: EventHandler; /** passive 修饰符(actview 事件系统小写后缀解析) */ onScrollPassive?: EventHandler; onWheel?: EventHandler; onLoad?: EventHandler; onError?: EventHandler; onAbort?: EventHandler; onCanPlay?: EventHandler; onEnded?: EventHandler; onLoadedData?: EventHandler; onPause?: EventHandler; onPlay?: EventHandler; onPlaying?: EventHandler; onProgress?: EventHandler; onTimeUpdate?: EventHandler; onVolumeChange?: EventHandler; onWaiting?: EventHandler; onAnimationStart?: EventHandler; onAnimationEnd?: EventHandler; onTransitionEnd?: EventHandler; onClickCapture?: EventHandler; onMouseDownCapture?: EventHandler; onMouseUpCapture?: EventHandler; onKeyDownCapture?: EventHandler; onKeyUpCapture?: EventHandler; onFocusCapture?: EventHandler; onBlurCapture?: EventHandler; onChangeCapture?: EventHandler; onInputCapture?: EventHandler; onSubmitCapture?: EventHandler; onScrollCapture?: EventHandler; onclick?: EventHandler; ondblclick?: EventHandler; onmousedown?: EventHandler; onmouseup?: EventHandler; onmousemove?: EventHandler; onmouseenter?: EventHandler; onmouseleave?: EventHandler; onmouseover?: EventHandler; onmouseout?: EventHandler; oncontextmenu?: EventHandler; onkeydown?: EventHandler; onkeyup?: EventHandler; onkeypress?: EventHandler; onfocus?: EventHandler; onblur?: EventHandler; onfocusin?: EventHandler; onfocusout?: EventHandler; oninput?: EventHandler; onchange?: EventHandler; onsubmit?: EventHandler; onreset?: EventHandler; oninvalid?: EventHandler; onselect?: EventHandler; onsearch?: EventHandler; oncopy?: EventHandler; oncut?: EventHandler; onpaste?: EventHandler; ondrag?: EventHandler; ondragstart?: EventHandler; ondragend?: EventHandler; ondragover?: EventHandler; ondragenter?: EventHandler; ondragleave?: EventHandler; ondrop?: EventHandler; onpointerdown?: EventHandler; onpointerup?: EventHandler; onpointermove?: EventHandler; onpointerenter?: EventHandler; onpointerleave?: EventHandler; ontouchstart?: EventHandler; ontouchend?: EventHandler; ontouchmove?: EventHandler; ontouchcancel?: EventHandler; onscroll?: EventHandler; onwheel?: EventHandler; onload?: EventHandler; onerror?: EventHandler; onabort?: EventHandler; oncanplay?: EventHandler; onended?: EventHandler; onloadeddata?: EventHandler; onpause?: EventHandler; onplay?: EventHandler; onplaying?: EventHandler; onprogress?: EventHandler; ontimeupdate?: EventHandler; onvolumechange?: EventHandler; onwaiting?: EventHandler; onanimationstart?: EventHandler; onanimationend?: EventHandler; ontransitionend?: EventHandler; } interface AriaAttributes { [key: `aria-${string}`]: string | number | boolean | undefined; } interface HTMLAttributes extends AriaAttributes, DOMAttributes { children?: VNodeChildren; key?: string | number | null; ref?: any; /** * scoped 标记 prop(@actview/plugin-scoped):值为 scoped 属性名 * (如 "data-v-abc12345",可空格分隔多个)。组件元素由插件自动注入, * 子组件在 props 声明后手动应用到根元素,运行时翻译为真实属性。 */ scopedId?: string; id?: string; class?: string; className?: string; style?: string | Record; title?: string; dir?: string; lang?: string; hidden?: boolean; draggable?: boolean | 'true' | 'false'; tabIndex?: number; /** 小写别名(HTML 属性名;运行时 setProp 按 attribute 原样设置) */ tabindex?: number | string; accessKey?: string; contentEditable?: boolean | 'true' | 'false' | 'plaintext-only'; spellCheck?: boolean; /** 全局属性 autocapitalize(HTML 小写) */ autocapitalize?: string; /** Safari 私有属性(HTML 小写) */ autocorrect?: string; /** 虚拟键盘动作提示(HTML 小写属性) */ enterkeyhint?: string; /** 小写别名(HTML 属性名) */ spellcheck?: boolean | string; role?: string; slot?: string; translate?: 'yes' | 'no'; /** 移动端虚拟键盘类型提示(Living Standard) */ inputMode?: 'none' | 'text' | 'tel' | 'url' | 'email' | 'numeric' | 'decimal' | 'search'; /** CSP nonce */ nonce?: string; /** 指定自定义内置元素(Living Standard) */ is?: string; /** 惰性元素(现代属性) */ inert?: boolean; /** 旧版 contextmenu */ contextMenu?: string; radioGroup?: string; /** 驼峰标准名(React 命名;小写 autocapitalize 历史兼容) */ autoCapitalize?: string; autoCorrect?: string; enterKeyHint?: string; autoSave?: string; itemID?: string; itemProp?: string; itemRef?: string; itemScope?: boolean; itemType?: string; about?: string; datatype?: string; inlist?: any; prefix?: string; property?: string; resource?: string; 'typeof'?: string; vocab?: string; color?: string; results?: number; security?: string; unselectable?: 'on' | 'off'; wmode?: string; profile?: string; icon?: string; mediaGroup?: string; manifest?: string; credentialless?: boolean; /** React 语义:dangerouslySetInnerHTML(渲染层 setProp 透传) */ dangerouslySetInnerHTML?: { __html: string; }; [key: `data-${string}`]: unknown; } interface AnchorHTMLAttributes extends HTMLAttributes { href?: string; target?: string; download?: string; rel?: string; hreflang?: string; /** 驼峰标准名(React 命名;hreflang 小写历史兼容) */ hrefLang?: string; referrerPolicy?: string; type?: string; ping?: string; } interface ImgHTMLAttributes extends HTMLAttributes { src?: string; alt?: string; width?: number | string; height?: number | string; loading?: 'eager' | 'lazy'; decoding?: 'async' | 'sync' | 'auto'; srcSet?: string; crossOrigin?: string; referrerPolicy?: string; sizes?: string; useMap?: string; } interface InputHTMLAttributes extends HTMLAttributes { type?: 'text' | 'password' | 'email' | 'number' | 'checkbox' | 'radio' | 'file' | 'submit' | 'reset' | 'button' | 'range' | 'date' | 'time' | 'color' | 'hidden' | 'search' | 'tel' | 'url' | 'month' | 'week' | 'datetime-local'; value?: string | number | readonly string[]; checked?: boolean; disabled?: boolean; placeholder?: string; readonly?: boolean; readOnly?: boolean; required?: boolean; name?: string; accept?: string; /** React 语义:defaultChecked 走 property(非受控默认选中,对齐 React InputHTMLAttributes) */ defaultChecked?: boolean; multiple?: boolean; min?: number | string; max?: number | string; step?: number | string; minLength?: number; maxLength?: number; autoFocus?: boolean; autoComplete?: string; /** 小写别名(HTML 属性名) */ autocomplete?: string; pattern?: string; size?: number; /** 表单关联属性( 合法) */ form?: string; /** React 语义:defaultValue 走 property(PD-23) */ defaultValue?: string | number | readonly string[]; /** type=image 的资源地址 */ src?: string; /** type=image 的替代文本 */ alt?: string; /** type=image 的渲染尺寸 */ height?: number | string; width?: number | string; /** 移动端媒体捕获(https://www.w3.org/TR/html-media-capture/) */ capture?: boolean | 'user' | 'environment'; /** 关联 的 id */ list?: string; /** form* 覆盖属性(对齐 React InputHTMLAttributes) */ formAction?: string; formEncType?: string; formMethod?: string; formNoValidate?: boolean; formTarget?: string; /** 跨域策略(type=image / CORS 场景) */ crossOrigin?: string; /** 表单控件方向性(dir=auto 场景,Living Standard) */ dirName?: string; /** 虚拟键盘动作提示(驼峰标准名) */ enterKeyHint?: string; } interface TextareaHTMLAttributes extends HTMLAttributes { value?: string; rows?: number; cols?: number; placeholder?: string; disabled?: boolean; readonly?: boolean; readOnly?: boolean; required?: boolean; name?: string; maxLength?: number; minLength?: number; autoFocus?: boolean; autoComplete?: string; wrap?: string; dirName?: string; /** React 语义:defaultValue 走 property(非受控默认值) */ defaultValue?: string; /** 表单关联属性(