在 getDerivedStateFromError() 中我们可以期待什么错误类型?

Nar*_*esh 7 typescript reactjs

根据TypeScript 定义,类型为any,而相关方法componentDidCatch()收到类型为 的错误Error。为什么会出现这种不一致?

Gab*_*ile 6

Typescript 有一个Error可以使用的全局接口。

interface Error {
    stack?: string;
}
Run Code Online (Sandbox Code Playgroud)

所以你可以使用

static getDerivedStateFromError(error: Error) {
  // ...
}

componentDidCatch(error: Error, errorInfo: React.ErrorInfo) {
  // ...
}
Run Code Online (Sandbox Code Playgroud)

GetDerivedStateFromError类型显示在下面,我认为这是错误类型不应该是类型any,而且类型Error

type GetDerivedStateFromError<P, S> =
        /**
         * This lifecycle is invoked after an error has been thrown by a descendant component.
         * It receives the error that was thrown as a parameter and should return a value to update state.
         *
         * Note: its presence prevents any of the deprecated lifecycle methods from being invoked
         */
        (error: any) => Partial<S> | null;
Run Code Online (Sandbox Code Playgroud)


fo_*_*fo_ 4

当前接受的答案和 React 类型定义不正确。事实上,异常可以是任何类型(包括nullundefinednumber或任何其他类型)。只需尝试从渲染函数中抛出其中一些值,看看会发生什么。如果你想完全正确,你应该使用

static getDerivedStateFromError(error: unknown) { ... }
Run Code Online (Sandbox Code Playgroud)

componentDidCatch(error: unknown, errorInfo: React.ErrorInfo) { ... }
Run Code Online (Sandbox Code Playgroud)

如有必要,请检查错误处理代码中的错误类型。例如,您可以使用

if (error instanceof Error) { ... }
Run Code Online (Sandbox Code Playgroud)

检查错误是否确实是Error 对象