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

从预定义对象联合类型返回Partial时的TypeScript类型错误解惑

问题解析

你遇到的错误核心在于泛型S的不确定性。虽然S extends States,但TypeScript无法在分支逻辑中确定S就是联合类型States中的某一个具体成员——S可能是States的更细化子类型(比如{type: "a", data: string, extra: number})。这时候返回{data: "foo"}或{data: 2}就无法满足Partial<S>的类型要求,因为Partial<S>可能包含更多可选属性,而你返回的对象只包含data。

举个例子,如果调用getPartial时传入的是:

const customState = {type: "a", data: "bar", extra: 123} as const;
getPartial(customState);

此时S的类型是{type: "a", data: "bar", extra: 123},Partial<S>会包含可选的type、data、extra属性,但你返回的{data: "foo"}缺少extra的可选定义,类型检查自然不通过。

解决方案

根据你的需求,有几种可行的修复方式:

1. 移除泛型,直接返回Partial<States>

如果不需要保留输入状态的具体子类型信息,直接将返回类型改为Partial<States>即可:

type States = {type: "a", data: string} | {type: "b", data: number};

function getPartial(state: States) : Partial<States> {
  if (state.type === "a") {
    return {data: "foo"};
  }
  return {data: 2};
};

2. 使用条件类型匹配泛型S

通过条件类型让TypeScript明确不同S对应的返回类型:

type States = {type: "a", data: string} | {type: "b", data: number};

type PartialState<S extends States> = 
  S extends {type: "a"} ? Partial<{type: "a", data: string}> :
  S extends {type: "b"} ? Partial<{type: "b", data: number}> :
  never;

function getPartial<S extends States>(state: S) : PartialState<S> {
  if (state.type === "a") {
    return {data: "foo"} as PartialState<S>;
  }
  return {data: 2} as PartialState<S>;
};

3. 类型断言(简单直接但需谨慎)

如果能确保输入的S就是States的原始联合成员,可直接用类型断言跳过检查:

type States = {type: "a", data: string} | {type: "b", data: number};

function getPartial<S extends States>(state: S) : Partial<S> {
  if (state.type === "a") {
    return {data: "foo"} as Partial<S>;
  }
  return {data: 2} as Partial<S>;
};

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 18:16:03