zhangjian
2023-06-05 0976d2d0f90cff460cedfdc8bd74e98c2c31a58c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
export type Dictionary<T> = {
    [key: string]: T
}
 
/**
 * Not readonly ArrayLike
 * Include Array, TypedArray
 */
export type ArrayLike<T> = {
    [key: number]: T
    length: number
}
 
export type ImageLike = HTMLImageElement | HTMLCanvasElement | HTMLVideoElement
 
// subset of CanvasTextBaseline
export type TextVerticalAlign = 'top' | 'middle' | 'bottom'
    // | 'center' // DEPRECATED
 
// TODO: Have not support 'start', 'end' yet.
// subset of CanvasTextAlign
export type TextAlign = 'left' | 'center' | 'right'
    // | 'middle' // DEPRECATED
 
export type FontWeight = 'normal' | 'bold' | 'bolder' | 'lighter' | number;
export type FontStyle = 'normal' | 'italic' | 'oblique';
 
export type BuiltinTextPosition = 'left' | 'right' | 'top' | 'bottom' | 'inside'
    | 'insideLeft' | 'insideRight' | 'insideTop' | 'insideBottom'
    | 'insideTopLeft' | 'insideTopRight'| 'insideBottomLeft' | 'insideBottomRight';
 
export type WXCanvasRenderingContext = CanvasRenderingContext2D & {
    draw: () => void
};
 
export type ZRCanvasRenderingContext = CanvasRenderingContext2D & {
    dpr: number
    __attrCachedBy: boolean | number
}
 
// Properties zrender will extended to the raw event
type ZREventProperties = {
    zrX: number
    zrY: number
    zrDelta: number
 
    // 'no_globalout' means: do not trigger "globalout" event to zr user.
    // 'only_globalout" means: only trigger "globalout" event, but do not
    //     trigger other event to zr user.
    zrEventControl: 'no_globalout' | 'only_globalout'
 
    zrByTouch: boolean
}
 
export type ZRRawMouseEvent = MouseEvent & ZREventProperties
export type ZRRawTouchEvent = TouchEvent & ZREventProperties
export type ZRRawPointerEvent = TouchEvent & ZREventProperties
 
export type ZRRawEvent = ZRRawMouseEvent | ZRRawTouchEvent | ZRRawPointerEvent
 
export type ZRPinchEvent = ZRRawEvent & {
    pinchScale: number
    pinchX: number
    pinchY: number
    gestureEvent: string
}
 
export type ElementEventName = 'click' | 'dblclick' | 'mousewheel' | 'mouseout' |
    'mouseover' | 'mouseup' | 'mousedown' | 'mousemove' | 'contextmenu' |
    'drag' | 'dragstart' | 'dragend' | 'dragenter' | 'dragleave' | 'dragover' | 'drop' | 'globalout';
 
export type ElementEventNameWithOn = 'onclick' | 'ondblclick' | 'onmousewheel' | 'onmouseout' |
    'onmouseup' | 'onmousedown' | 'onmousemove' | 'oncontextmenu' |
    'ondrag' | 'ondragstart' | 'ondragend' | 'ondragenter' | 'ondragleave' | 'ondragover' | 'ondrop';
 
export type RenderedEvent = {
    elapsedTime: number
};
 
// Useful type methods
export type PropType<TObj, TProp extends keyof TObj> = TObj[TProp];
 
export type AllPropTypes<T> = PropType<T, keyof T>
 
export type FunctionPropertyNames<T> = {[K in keyof T]: T[K] extends Function ? K : never}[keyof T];
 
export type MapToType<T extends Dictionary<any>, S> = {
    [P in keyof T]: T[P] extends Dictionary<any> ? MapToType<T[P], S> : S
}
 
// See https://www.staging-typescript.org/docs/handbook/advanced-types.html#distributive-conditional-types
// For the case:
// `keyof A | B` does not equals to `Keyof A | Keyof B`
// KeyOfDistributive<A | B> equals to `KeyOfDistributive<A> | KeyOfDistributive<B>`
export type KeyOfDistributive<T> = T extends unknown ? keyof T : never;
 
export type WithThisType<Func extends (...args: any) => any, This> =
    (this: This, ...args: Parameters<Func>) => ReturnType<Func>;