import React from 'react' import egretProps from './egret/index' import euiProps from './eui/index' import customProps from './custom' import type { IPropsHandlers, IElementProps, ExtensionObj } from '../type' export type NodeProps = { children?: React.ReactNode ref?: React.Ref key?: React.Key } & IElementProps type InferClass = T extends { __Class: new (...args: any[]) => infer U } ? U : any /** * @description 用于将 IPropsHandlers 转换为 JSX Element 的工具类型 * 它会将所有 `__` 开头的属性剔除,再取所有函数的第一个参数类型作为属性的类型 */ export type TransProp = { [key in Exclude]?: T[key] extends (args: any) => any ? Parameters[0]['newValue'] : T[key] } & NodeProps> declare global { namespace JSX { interface IntrinsicElements { displayObject: TransProp displayObjectContainer: TransProp shape: TransProp sprite: TransProp bitmap: TransProp bitmapText: TransProp textField: TransProp 'eui-component': TransProp 'eui-group': TransProp 'eui-image': TransProp 'eui-bitmapLabel': TransProp 'eui-label': TransProp 'eui-rect': TransProp 'eui-scroller': TransProp 'eui-button': TransProp 'eui-dataGroup': TransProp 'eui-editableText': TransProp 'eui-list': TransProp 'eui-itemRenderer': TransProp objectContainer: TransProp arrayContainer: TransProp primitive: TransProp font: TransProp } } } export interface Catalogue { [name: string]: IPropsHandlers } export let catalogueMap: Catalogue = {} export const extend = (newCatalogue: Catalogue) => { return (catalogueMap = { ...catalogueMap, ...newCatalogue }) } export type EventCategoryInfo = { category: any withPrefix: boolean // 是否去除前缀 } export const EVENT_CATEGORY_MAP: { [key: string]: EventCategoryInfo } = { Touch: { category: egret.TouchEvent, withPrefix: true, }, Item: { category: eui.ItemTapEvent, withPrefix: true, }, Ui: { category: eui.UIEvent, withPrefix: false, }, Focus: { category: egret.FocusEvent, withPrefix: true, }, } extend({ ...Object.entries({ ...egretProps, ...customProps }).reduce((acc, [key, val]) => { acc[key] = val return acc }, {} as ExtensionObj), ...(Object.keys(euiProps) as (keyof typeof euiProps)[]).reduce((acc, key) => { acc[`eui-${key}`] = euiProps[key] return acc }, {} as ExtensionObj), })