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

如何声明AuthType类型,使navigateTo排除accepted指定的枚举键?

解决枚举键排除的泛型类型声明问题

你需要利用TypeScript的Exclude工具类型,从AuthStatus枚举中移除被指定为accepted的泛型参数T,以此约束navigateTo的键只能是剩下的枚举成员。

修正后的类型声明

enum AuthStatus {
  UNAUTHENTICATED,
  ONBOARDING,
  AUTHENTICATED
}

type AuthType<T extends AuthStatus> = {
  accepted: T,
  // 用Exclude排除掉accepted对应的枚举值,只保留剩余成员作为键
  navigateTo: Record<Exclude<AuthStatus, T>, string>
}

验证示例

给每个实例指定明确的泛型参数,TypeScript会自动校验navigateTo的键是否符合要求:

// accepted为UNAUTHENTICATED,navigateTo自动排除该值
const exampleA: AuthType<AuthStatus.UNAUTHENTICATED> = {
  accepted: AuthStatus.UNAUTHENTICATED,
  navigateTo: {
    [AuthStatus.ONBOARDING]: '/onboarding',
    [AuthStatus.AUTHENTICATED]: '/',
  }
}

// accepted为ONBOARDING,navigateTo自动排除该值
const exampleB: AuthType<AuthStatus.ONBOARDING> = {
  accepted: AuthStatus.ONBOARDING,
  navigateTo: {
    [AuthStatus.UNAUTHENTICATED]: '/login',
    [AuthStatus.AUTHENTICATED]: '/',
  }
}

// accepted为AUTHENTICATED,navigateTo自动排除该值
const exampleC: AuthType<AuthStatus.AUTHENTICATED> = {
  accepted: AuthStatus.AUTHENTICATED,
  navigateTo: {
    [AuthStatus.UNAUTHENTICATED]: '/login',
    [AuthStatus.ONBOARDING]: '/onboarding',
  }
}

错误校验示例

如果navigateTo中包含了accepted对应的枚举值,TypeScript会直接抛出类型错误:

// 此处会触发类型错误:navigateTo中包含了accepted的UNAUTHENTICATED
const badExample: AuthType<AuthStatus.UNAUTHENTICATED> = {
  accepted: AuthStatus.UNAUTHENTICATED,
  navigateTo: {
    [AuthStatus.UNAUTHENTICATED]: '/login',
    [AuthStatus.ONBOARDING]: '/onboarding',
  }
}

内容的提问来源于stack exchange,提问作者W.S.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 23:03:25