ReactのcomponentDidCatchの第1引数ってunknownだよね


経緯

componentDidCatchを書こうとしたところ第1引数がErrorになってて、違和感を感じた。
確認する。

componentDidCatchの定義

現実

https://github.com/DefinitelyTyped/DefinitelyTyped/blob/master/types/react/index.d.ts#L647

componentDidCatch?(error: Error, errorInfo: ErrorInfo): void;

理想

componentDidCatch?(error: unkown, errorInfo: ErrorInfo): void;

確認

Error型の定義の確認

es5.d.tsに定義があった

https://github.com/microsoft/TypeScript/blob/main/src/lib/es5.d.ts#L1007-L1011
interface Error {
    name: string;
    message: string;
    stack?: string;
}

es2022.error.d.tsにもあった

https://github.com/microsoft/TypeScript/blob/main/src/lib/es2022.error.d.ts#L5-L7
interface Error {
    cause?: Error;
}

実際の動作確認

undefined を throwして undefinedがとれたら nameやmessageが取れないので型定義としては微妙だろう。

https://codesandbox.io/s/componnentdidcatch-throw-undefined-z5tn64?file=/src/App.js

追加されたときのプルリク

https://github.com/DefinitelyTyped/DefinitelyTyped/pull/18463

プルリクしないの?

確認がとれて、余裕があればするよ…代わりにやってくれてもいいのよ

メモ

  • --useUnknownInCatchVariablesのことを考慮するとanyが無難だけどその辺どう処理するのか確認