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

TypeScript输入属性条件类型问题:handler参数隐式为any求解

解决TypeScript中handler参数被推断为any的问题

问题核心在于input函数没有使用泛型,导致TypeScript无法根据传入的type字段精确推断handler的具体类型。当调用input时,TProps默认使用联合类型TInputType,handler的类型会变成THandler<number> | THandler<string>,TypeScript无法确定具体分支,只能将参数推断为any。

解决方案

把input改成泛型函数,让TypeScript能自动根据传入的props推断泛型参数:

type TInputType = 'text' | 'number' | 'date';

type THandler<V> = (e: Event, data: { value: V }) => void;

type TProps<T extends TInputType = TInputType> = {
  type: T;
} & (
  T extends 'number' ? {
    value: number;
    handler: THandler<number>;
  } : {
    value: string;
    handler: THandler<string>;
  }
);

// 将input改为泛型函数
function input<T extends TInputType>(props: TProps<T>) {
  console.log(props);
}

const val = 1234;

input({ 
  type: 'number', 
  value: val, 
  handler: (e, { value }) => {
    // 此时e会被推断为Event,value为number
    console.log(e, value);
  } 
});

修改后,当传入type: 'number'时,TypeScript会自动推断泛型T为'number',进而确定handler的类型是THandler<number>,参数e和value就能获得正确的类型提示,不会再出现any的推断问题。

扩展:支持date类型

如果需要为date类型单独定义对应类型,可以扩展TProps的条件分支:

type TProps<T extends TInputType = TInputType> = {
  type: T;
} & (
  T extends 'number' ? {
    value: number;
    handler: THandler<number>;
  } : T extends 'date' ? {
    value: Date;
    handler: THandler<Date>;
  } : {
    value: string;
    handler: THandler<string>;
  }
);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 21:52:50