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

TypeScript如何定义基于布尔值判断的条件可选属性类型?

解决方案

你可以使用TypeScript的可辨识联合类型实现你要的效果,让TS能根据success字段的值自动收窄类型,无需额外可选链操作。

步骤1:重新定义响应类型

将原来的单个类型拆分为成功、失败两个独立子类型,再联合为总响应类型:

// 成功响应:success固定为true,data必传,无err字段
type SuccessResponse = {
  success: true;
  data: { [key: string]: string };
}

// 失败响应:success固定为false,err必传,无data字段
type ErrorResponse = {
  success: false;
  err: { code: number, message: string };
}

// 总响应类型是两者的联合
type ServerResponse = SuccessResponse | ErrorResponse;

步骤2:直接按原有逻辑编写代码

此时TS会自动根据success的判断结果收窄对应类型,不需要再加可选链:

const resp: ServerResponse = await fetch(...);

if(resp.success) {
  // 此处TS自动识别resp为SuccessResponse类型,data必然存在
  doSomething(resp.data.foo);
} else {
  // 此处TS自动识别resp为ErrorResponse类型,err必然存在
  handleErr(resp.err.message);
}

泛用扩展(可选)

如果要适配不同接口的data返回结构,可以定义为泛型类型复用:

type SuccessResp<T> = {
  success: true;
  data: T;
}

type ErrorResp = {
  success: false;
  err: { code: number, message: string };
}

type ApiResponse<T = unknown> = SuccessResp<T> | ErrorResp;

// 使用示例:指定当前接口的data是用户信息结构
type UserInfo = { id: string; name: string; phone: string };
const resp: ApiResponse<UserInfo> = await fetch('/api/user/info');

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 16:48:02