如何声明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.
相关产品推荐
相关产品推荐

