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

如何读取联合类型的状态变量中的字段?

解决Zustand联合类型访问的TypeScript错误

你的问题核心是TypeScript无法自动缩小联合类型的范围——虽然你用了空值守卫排除了null,但剩下的{ cm: number } | { ft: number; in: number }分支里,TS无法确定当前height.value到底属于哪一个,所以直接访问ft会报错。以下是几种可靠的解决方法:

方法1:自定义类型谓词(推荐)

写一个自定义类型守卫函数,明确判断当前值是否属于英尺英寸类型,让TypeScript精准缩小类型范围:

// 定义你的联合类型
type HeightValue = { cm: number } | { ft: number; in: number } | null;

// 自定义类型守卫
function isFeetInches(value: HeightValue): value is { ft: number; in: number } {
  return value !== null && 'ft' in value;
}

// 使用示例
const ftPlaceholder = isFeetInches(height.value) ? height.value.ft.toString() : '';

方法2:内联类型守卫

如果不想单独写函数,可以直接在表达式里用in操作符做内联判断:

const ftPlaceholder = height.value && 'ft' in height.value 
  ? height.value.ft.toString() 
  : '';

或者结合可选链简化:

const ftPlaceholder = ('ft' in (height.value ?? {})) 
  ? height.value?.ft.toString() ?? '' 
  : '';

方法3:类型断言(谨慎使用)

如果你能100%确定当前height.value一定是英尺英寸类型,可以用类型断言强制告诉TS类型,但这种方式跳过了TS的类型检查,存在运行时风险:

const ftPlaceholder = (height.value as { ft: number; in: number })?.ft?.toString() ?? '';

为什么之前的空值守卫没用?

空值守卫(比如height.value?.)只是排除了null分支,但剩下的两个对象类型{ cm: number }和{ ft: number; in: number }没有明确的区分标识,TS无法自动推断,必须通过in操作符或自定义类型守卫来进一步缩小范围。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 14:32:47