suchen

Heim  >  Fragen und Antworten  >  Hauptteil

Was ist der korrekte Ersatz des Rückgabetyps für JSX.Element, wenn der globale JSX-Namespace veraltet ist?

Der @types/react 中,全局 JSX-Namespace ist veraltet:

declare global {
    /**
     * @deprecated Use `React.JSX` instead of the global `JSX` namespace.
     */
    namespace JSX {
    ...
    }
}

Seit ich ESLints deprecation/deprecation 规则(来自插件 eslint-plugin-deprecation aktiviert habe, erhalte ich jetzt eine Fehlermeldung für den Rückgabetyp der Funktionskomponente wie folgt:

export default function TestComponent(): JSX.Element { // This JSX is marked as deprecated
    return (
        <span>Test</span>
    );
}

Seit global JSX 命名空间已被弃用,那么在这种情况下 JSX.Element was ist der richtige Rückgabetyp-Ersatz?

Ist es React.JSX.Element wie in der Einstellungsmeldung angegeben:

export default function TestComponent(): React.JSX.Element { ... }

oder ReactElement so:

import { ReactElement } from "react";
export default function TestComponent(): ReactElement { ... }

Oder noch besser: Deklarieren Sie die Funktionskomponente mit React.FC und lassen Sie TypeScript den Rückgabetyp ableiten, etwa so:

export const TestComponent: React.FC = () => { ... };


P粉404539732P粉404539732435 Tage vor797

Antworte allen(2)Ich werde antworten

  • P粉465287592

    P粉4652875922023-10-27 11:55:24

    使用React.JSX


    或者从 "react" 导入 JSX

    import {JSX} from 'react'
    

    Antwort
    0
  • P粉521748211

    P粉5217482112023-10-27 00:02:44

    直接使用React.ReactElement(或者更准确地说,React.ReactElement | null):

    import { ReactElement } from "react";
    
    export function TestComponent(): ReactElement | null {
      return (
        Math.random() < 0.5
          ? null
          : <>
              A single Element (could be a Fragment like here)
            </>
      );
    }

    这正是(不再推荐)React.FC 强制执行:

    interface FunctionComponent<P = {}> {
      (props: P, context?: any): ReactElement<any, any> | null;
      // ...
    }

    它也是 JSXElementConstructor

    type JSXElementConstructor<P> =
      | ((props: P) => ReactElement<any, any> | null) // Case of a Function Component
      | (new (props: P) => Component<any, any>); // Case of a Class-based Component

    话虽这么说,除非您有一些规则强制您输入函数组件返回类型,否则您可以为了简单起见而忽略它:

    export function TestComponent() {
      // ...
    }

    显然,该功能现在可以返回任何内容,Typescript不会抱怨...除非您尝试将其用作JSX模板中的功能组件,否则在fb/cra#8177

    const Example = () => <Component />; // Error here, due to Component returning the wrong thing

    Antwort
    0
  • StornierenAntwort