You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用TypeScript约束路由数组包含全部路由枚举?

解决TypeScript路由数组必须包含全部路由类型的约束问题

已知场景:

  • 在.d.ts文件中已定义路由联合类型:type Routes = '/' | '/achievements' | ...;
  • 需要创建数组allRoutes,要求必须包含Routes的所有成员,缺失则触发TypeScript编译报错

以下是两种可行方案:

方案一:利用工具类型强制检查

通过自定义工具类型,判断数组是否覆盖了Routes的所有成员,未覆盖则返回never类型触发报错。

// 假设d.ts中的路由类型
type Routes = '/' | '/achievements' | '/profile';

// 工具类型:验证数组是否包含全部路由
type MustIncludeAllRoutes<T extends Routes[]> = Exclude<Routes, T[number]> extends never ? T : never;

// 正确定义(包含所有路由)
const allRoutes: MustIncludeAllRoutes<['/', '/achievements', '/profile']> = ['/', '/achievements', '/profile'];

// 错误示例(缺失路由):会触发编译报错
// const allRoutes: MustIncludeAllRoutes<['/', '/achievements']> = ['/', '/achievements'];
// 报错信息:Type '["/", "/achievements"]' is not assignable to type 'never'.

核心逻辑:Exclude<Routes, T[number]>会筛选出Routes中未出现在数组元素类型里的成员,若结果为never,说明所有路由都已被包含,否则工具类型返回never,导致数组赋值失败。

方案二:通过辅助函数实现约束

编写一个辅助函数,利用泛型推断数组类型,同时在参数层面做约束,未覆盖全部路由时无法传入参数。

type Routes = '/' | '/achievements' | '/profile';

function createAllRoutes<T extends Routes[]>(
  routes: Exclude<Routes, T[number]> extends never ? T : never
): T {
  return routes;
}

// 正确用法
const allRoutes = createAllRoutes(['/', '/achievements', '/profile']);

// 错误用法(缺失路由):触发编译报错
// const allRoutes = createAllRoutes(['/', '/achievements']);
// 报错信息:Argument of type '["/", "/achievements"]' is not assignable to parameter of type 'never'.

这种方式更简洁,通过函数参数的类型约束自动完成检查,无需手动指定数组的泛型参数。

注意事项

  • 确保.d.ts中的Routes类型可以被工具类型或辅助函数访问(若为模块类型需正确导入,全局类型则直接可用)
  • 以上均为编译时检查,运行时不会产生额外性能开销

内容的提问来源于stack exchange,提问作者coolswood

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 20:30:37