从 react-router-dom 属性“sumParams”升级版本 4 useParams() 后 TypeScript 错误在类型“{}”上不存在

Yoe*_*oel 52 javascript typescript reactjs react-dom react-router-dom

从 react-router-dom 升级到 useParams () 中使用的版本 4 后,出现 typeScript 错误

"typescript": "^4.0.2"

import { useParams } from 'react-router-dom';

const { sumParams } = useParams();

Run Code Online (Sandbox Code Playgroud)
Property 'sumParams' does not exist on type '{}'. 
Run Code Online (Sandbox Code Playgroud)

该项目运行良好,只有在升级后才会引发错误

Yoe*_*oel 128

useParams是通用的。您需要通过指定泛型的值来告诉打字稿您正在使用哪些参数

有几种方法可以解决这个问题

这是我最喜欢的方式

const { sumParams } = useParams<{ sumParams: string }>();
Run Code Online (Sandbox Code Playgroud)

但是还有更多的方法 (:

或者

interface ParamTypes {
  sumParams: string;
}
Run Code Online (Sandbox Code Playgroud)

然后在你的组件中

const { sumParams } = useParams<ParamTypes>();
Run Code Online (Sandbox Code Playgroud)

或者

添加没有接口的任何类型

const { sumParams } : any = useParams();
Run Code Online (Sandbox Code Playgroud)

注意:这样你将无法将其设置为字符串

或者

keemor 的更多选择:

const { sumParams } = useParams() as { 
  sumParams: string;
}
Run Code Online (Sandbox Code Playgroud)

  • 你知道 TS 版本之间发生了什么变化导致这个错误吗?我在更改日志中找不到任何表明此情况会发生更改的内容。 (2认同)
  • 更新:我在 npm 上对 typescript 版本进行了二进制搜索,这开始成为版本 4.0.0-dev.20200624 和 4.0.0-dev.20200625 之间的问题。您可以在此处查看这些版本之间的差异:https://diff.intrinsic.com/typescript/4.0.0-dev.20200624/4.0.0-dev.20200625 (2认同)

kee*_*mor 10

另一种选择是:

const { sumParams } = useParams() as { 
  sumParams: string;
}
Run Code Online (Sandbox Code Playgroud)


oso*_*nco 5

要使它像以前一样运行,只需添加“:any”

const { sumParams } : any = useParams();
Run Code Online (Sandbox Code Playgroud)