当前位置: 首页 > 知识库问答 >
问题:

使用typescript的React router v5上所需的url参数可以未定义

龚振
2023-03-14

我使用带有TypeScript的react router v5.1,并具有以下路由配置:

<Router basename="/" hashType="slash">
    <Switch>
        <Route path="/token/:tokenName">
            <TokenPage />
        </Route>
    </Switch>
</Router>

我尝试访问组件中的url参数(TokenName),使用useParams挂钩,如下所示:

const TokenPage: FC<TokenPageProps> = props => {
    const { tokenName } = useParams()
    ...
}

然而,typescript认为tokenName参数可以是未定义的:

这是没有意义的,因为如果URL中缺少参数,则react router将不匹配此路由。

在这种情况下,我如何修改打字?

共有3个答案

云锦
2023-03-14

考虑如何使用enum管理它

export const enum ROUTE_PATH {
  DASHBOARD = 'dashboard'
}
export const enum ROUTE_PARAM {
  DASH_ID = 'DASH_ID',
}
<Route path={`${ROUTE_PATH.DASHBOARD}/:${ROUTE_PARAM.DASH_ID}`} />
const { DASH_ID } = useParams<ROUTE_PARAM>();
百里诚
2023-03-14

使用重写类型的原始思想,您不需要创建新的命名接口,它可以直接在类型参数中完成:

const { tokenName } = useParams<{ tokenName: string }>();
公孙俭
2023-03-14

在这种情况下,您的< code>TokenPage代码不知道它被< code>Route包装。你是对的,如果URL不包含正确的参数,你的组件就不会被呈现。但是Typescript不知道这一点。

您在那里得到的默认类型是正确的,您应该在使用它之前对值进行空检查。

如果您想覆盖类型,useParams是泛型的,并接受指定返回值类型的类型。

interface ParamTypes {
  tokenName: string
}
const { tokenName } = useParams<ParamTypes>()

编辑日期:2010年9月29日

useParams的最新键入已更改。

export function useParams<Params extends { [K in keyof Params]?: string } = {}>(): Params;

如您所见,新的默认值是{},这不会暗示包含的任何键,但泛型约束确实假设这些值是string类型的。

因此,以下行现在将产生属性“tokenName”在类型“{}”上不存在。类型脚本错误。

js prettyprint-override">const { tokenName } = useParams()

要解决此问题,请键入具有已知参数的 useParams(如第一个示例中所示),也可以按如下方式键入:

const { tokenName } = useParams<Record<string, string | undefined>>()
 类似资料:
  • 我正在尝试使用mySql全文索引“匹配”语法进行查询。 我将Spring Boot版本从1.5.4.RELEASE更改为2.0.0m7,以使用spring data jpa版本2.0.2.Releases,因为在早期的spring data jpa版本中,带有countQuery的本机查询不起作用。 我已经用这里和这里的解决方案解决了几个问题。 当前的问题是以下错误: 这是代码 如果我尝试将可分页

  • 问题内容: 是否可以直接声明Flask URL可选参数? 目前,我正在按照以下方式进行: 我如何直接说这是可选的? 问题答案: 另一种方法是写 但是我想你想编写一条路由并将其标记为可选?如果是这样,我认为不可能。

  • 是否可以直接声明一个烧瓶URL可选参数? 目前,我正在按照以下方式进行: 我怎么能直接说是可选的?

  • 问题内容: 我正在创建一个简单的命令行实用程序,并使用字典作为一种case语句,并将关键字链接到它们的适当功能。这些函数都有不同数量的参数,因此当前要检查用户是否输入了每个函数所需的正确参数,我将所需数量的参数放入了格式的字典case语句中。 当前的设置工作得很好,但是我只是出于自我改进的目的,想知道是否有一种方法可以确定函数中所需参数的数量,而我的google尝试迄今未返回任何价值,但是我知道a

  • 问题内容: 我有一个像这样的Django URL: views.py: 问题是我希望参数是可选的。 我希望并且成为同等有效的URL模式,以便如果 通过,那么我可以使用它。 就目前而言,访问不带参数的URL时会得到404 。 问题答案: 有几种方法。 一种是在正则表达式中使用非捕获组:使正则 表达式Django URL令牌为可选 另一种更容易遵循的方法是拥有多个符合你需求的规则,所有规则都指向同一视

  • B继承A的时候是否可以将A中的参数快捷设置为可选? 使用type中的Partial<Type>方法不适用于Class