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

如何实现对象属性类型依赖另一属性?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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 05:25:57