如何实现对象属性类型依赖另一属性?TypeScript类型约束求助
用联合类型强制执行AuthState的状态约束
这是TypeScript里很典型的「关联属性类型约束」问题,原来的单一接口没法让TypeScript识别isSignedIn和user之间的依赖关系,所以才会逼你写冗余的多层检查。咱们可以用联合类型来精准描述这两种互斥的状态,彻底解决这个问题。
具体实现步骤
首先,把你的AuthState拆成两个互斥的子类型,分别对应「已登录」和「未登录」状态:
// 先定义User类型(假设你的User是这样的) interface User { name: string; // 其他用户属性... } // 未登录状态:isSignedIn为false,user可选为undefined(或直接省略) interface SignedOutState { isSignedIn: false; token?: string; user?: undefined; } // 已登录状态:isSignedIn为true,user必须存在,token建议设为必填(如果登录时一定会有) interface SignedInState { isSignedIn: true; token: string; user: User; } // 组合成最终的AuthState联合类型 type AuthState = SignedInState | SignedOutState;
使用效果
现在当你判断isSignedIn的状态时,TypeScript会自动窄化类型,不需要再额外检查user是否存在:
const authState: AuthState = /* 你的状态值 */; if (authState.isSignedIn) { // 这里TS明确知道authState是SignedInState,user一定存在 const userName = authState.user.name; // 完全不会报错! } else { // 这里是SignedOutState,user可能是undefined console.log("用户未登录"); }
对比你之前不得不写的冗余代码,现在的逻辑清晰多了,而且TypeScript会帮你严格执行状态约束——如果有人不小心写出isSignedIn: true但没传user的代码,TypeScript直接就会报错,从源头避免了错误。
灵活调整
如果你的业务里,登录时token也可能是可选的(比如某些场景下不需要token),只需要把SignedInState里的token改成token?: string就行,联合类型的约束逻辑依然成立。
内容的提问来源于stack exchange,提问作者JaffParker
相关产品推荐
相关产品推荐

