Blame view

天文台pc/tianwentai-ui/node_modules/@emotion/react/src/jsx-namespace.ts 4.23 KB
bc518174   王天杨   提交两个项目文件
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
99
100
101
102
103
104
105
106
107
  import 'react'
  import { Interpolation } from '@emotion/serialize'
  import { Theme } from './theming'
  
  type IsPreReact19 = 2 extends Parameters<React.FunctionComponent<any>>['length']
    ? true
    : false
  
  type WithConditionalCSSProp<P> = 'className' extends keyof P
    ? string extends P['className' & keyof P]
      ? { css?: Interpolation<Theme> }
      : {}
    : {}
  
  // unpack all here to avoid infinite self-referencing when defining our own JSX namespace for the pre-React 19 case
  
  // the IsPreReact19 and @ts-ignore comments are to allow @emotion/react to support three different cases of types
  // - pre-React 18.something which didn't have `React.JSX`
  // - React 18.something with `React.JSX`
  // - React 19 with `React.JSX` and no global `JSX`
  // we support both pre-React 19 cases by using the global `JSX` and with the React 19 types, we use `React.JSX`
  // to make this work, we need @ts-ignore comments to ignore references that are invalid
  // though note that the error types resulting from ignoring the errors will never be used
  // since the pre vs post React 19 conditional will pick the one that won't error
  
  // prettier-ignore
  /** @ts-ignore */
  type ReactJSXElement = true extends IsPreReact19 ? JSX.Element : React.JSX.Element
  
  // prettier-ignore
  /** @ts-ignore */
  type ReactJSXElementClass = true extends IsPreReact19 ? JSX.ElementClass : React.JSX.ElementClass
  
  // prettier-ignore
  /** @ts-ignore */
  type ReactJSXElementAttributesProperty = true extends IsPreReact19 ? JSX.ElementAttributesProperty : React.JSX.ElementAttributesProperty
  
  // prettier-ignore
  /** @ts-ignore */
  type ReactJSXElementChildrenAttribute = true extends IsPreReact19 ? JSX.ElementChildrenAttribute : React.JSX.ElementChildrenAttribute
  
  // prettier-ignore
  /** @ts-ignore */
  type ReactJSXLibraryManagedAttributes<C, P> = true extends IsPreReact19 ? JSX.LibraryManagedAttributes<C, P> : React.JSX.LibraryManagedAttributes<C, P>
  
  // prettier-ignore
  /** @ts-ignore */
  type ReactJSXIntrinsicAttributes = true extends IsPreReact19 ? JSX.IntrinsicAttributes : React.JSX.IntrinsicAttributes
  
  // prettier-ignore
  /** @ts-ignore */
  type ReactJSXIntrinsicClassAttributes<T> = true extends IsPreReact19 ? JSX.IntrinsicClassAttributes<T> : React.JSX.IntrinsicClassAttributes<T>
  
  // prettier-ignore
  /** @ts-ignore */
  type ReactJSXIntrinsicElements = true extends IsPreReact19 ? JSX.IntrinsicElements : React.JSX.IntrinsicElements
  
  // based on the code from @types/react@18.2.8
  // https://github.com/DefinitelyTyped/DefinitelyTyped/blob/3197efc097d522c4bf02b94e1a0766d007d6cdeb/types/react/index.d.ts#LL3204C13-L3204C13
  // prettier-ignore
  /** @ts-ignore */
  type ReactJSXElementType = true extends IsPreReact19 ? string | React.JSXElementConstructor<any> : React.JSX.ElementType
  
  export namespace ReactJSX {
    export type ElementType = ReactJSXElementType
    export interface Element extends ReactJSXElement {}
    export interface ElementClass extends ReactJSXElementClass {}
    export interface ElementAttributesProperty
      extends ReactJSXElementAttributesProperty {}
    export interface ElementChildrenAttribute
      extends ReactJSXElementChildrenAttribute {}
  
    export type LibraryManagedAttributes<C, P> = ReactJSXLibraryManagedAttributes<
      C,
      P
    >
  
    export interface IntrinsicAttributes extends ReactJSXIntrinsicAttributes {}
    export interface IntrinsicClassAttributes<T>
      extends ReactJSXIntrinsicClassAttributes<T> {}
  
    export type IntrinsicElements = ReactJSXIntrinsicElements
  }
  
  export namespace EmotionJSX {
    export type ElementType = ReactJSXElementType
    export interface Element extends ReactJSXElement {}
    export interface ElementClass extends ReactJSXElementClass {}
    export interface ElementAttributesProperty
      extends ReactJSXElementAttributesProperty {}
    export interface ElementChildrenAttribute
      extends ReactJSXElementChildrenAttribute {}
  
    export type LibraryManagedAttributes<C, P> = P extends unknown
      ? WithConditionalCSSProp<P> & ReactJSXLibraryManagedAttributes<C, P>
      : never
  
    export interface IntrinsicAttributes extends ReactJSXIntrinsicAttributes {}
    export interface IntrinsicClassAttributes<T>
      extends ReactJSXIntrinsicClassAttributes<T> {}
  
    export type IntrinsicElements = {
      [K in keyof ReactJSXIntrinsicElements]: ReactJSXIntrinsicElements[K] & {
        css?: Interpolation<Theme>
      }
    }
  }