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

TypeScript函数参数联合类型问题:onChange类型推断异常求助

解决TypeScript联合类型中onChange与value类型不匹配的问题

问题原因

你的代码中Props是联合类型,但解构onChange和value后,TypeScript无法关联这两个属性属于联合类型的同一分支。因此onChange的类型被推断为两个分支函数类型的交集——要求参数同时满足string[]和string(即never类型),自然无法正常调用。

解决方案

方案1:使用类型守卫缩小类型范围

通过判断isMultiselect或value的类型,让TypeScript明确当前分支的类型,从而正确匹配onChange和value:

interface BaseProps {
  label?: string;
}

interface MultiProps extends BaseProps {
  isMultiselect: true;
  value: string[];
  onChange: (value: string[]) => void;
}

interface SingleProps extends BaseProps {
  isMultiselect?: false;
  value: string;
  onChange: (value: string) => void;
 }

type Props = MultiProps | SingleProps;

// 方法A:判断isMultiselect
const example = ({ onChange, value, isMultiselect }: Props) => {
  if (isMultiselect) {
    onChange(value); // 此时value为string[],onChange参数类型匹配
  } else {
    onChange(value); // 此时value为string,onChange参数类型匹配
  }
};

// 方法B:判断value是否为数组
const example2 = ({ onChange, value }: Props) => {
  if (Array.isArray(value)) {
    onChange(value);
  } else {
    onChange(value);
  }
};

方案2:用泛型绑定value与onChange的类型

通过泛型将isMultiselect、value和onChange的类型绑定,让TypeScript在使用时自动推断对应类型:

interface BaseProps {
  label?: string;
}

// 泛型Props,根据T是否为true决定分支类型
type Props<T extends boolean = false> = BaseProps & (T extends true 
  ? {
      isMultiselect: true;
      value: string[];
      onChange: (value: string[]) => void;
    } 
  : {
      isMultiselect?: false;
      value: string;
      onChange: (value: string) => void;
    });

// 泛型函数,自动推断类型
const example = <T extends boolean>({ onChange, value }: Props<T>) => onChange(value);

// 测试示例
const singleDemo = { value: "hello", onChange: (val: string) => console.log(val) };
example(singleDemo); // 正常执行,val类型为string

const multiDemo = { 
  isMultiselect: true, 
  value: ["foo", "bar"], 
  onChange: (val: string[]) => console.log(val) 
};
example(multiDemo); // 正常执行,val类型为string[]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 19:53:14