我使用带有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将不匹配此路由。
在这种情况下,我如何修改打字?
考虑如何使用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>();
使用重写类型的原始思想,您不需要创建新的命名接口,它可以直接在类型参数中完成:
const { tokenName } = useParams<{ tokenName: string }>();
在这种情况下,您的< 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