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

TypeScript中如何检查函数签名,实现按钮创建函数的正确类型返回?

问题描述

在TypeScript中重载了createButton函数,用于创建点击触发特定回调action的按钮:

  • 创建Button1时,需传入无参数的action;
  • 创建Button2时,需传入带MyParam类型参数的action。

但存在类型安全问题:可以将实际返回的Button1强制转为Button2,示例如下:

const btn: Button2 = createButton({ label: "x", action: (/* 无参数 */) => void 0 }); // 实际返回Button1,但类型被强制转换

为此添加了hasActionParam属性来区分两种按钮类型,现在需要在函数实现中判断传入的action是否带有MyParam参数,以此设置hasActionParam的值。

相关类型与函数定义:

interface Button1 {
  label: string;
  action: () => void;
  hasActionParam: false;
}
interface Button2 {
  label: string;
  action: (param: MyParam) => void;
  hasActionParam: true;
}

function createButton({ label, action }: { label: string; action: () => void }): Button1;
function createButton({ label, action }: { label: string; action: (param: MyParam) => void }): Button2;
function createButton({
  label = "",
  action
}: { label: string; action: () => void | (param: MyParam) => void }): Button1 | Button2 {
  return {
    label,
    action,
    hasActionParam: /* 需要实现判断逻辑 */ ? true : false
  };
}
解决方案

可以利用JavaScript函数的length属性来判断形参数量——该属性会返回函数定义时的形参个数(不包含剩余参数和带默认值的参数,刚好匹配当前场景)。

具体实现如下:

function createButton({
  label = "",
  action
}: { label: string; action: () => void | (param: MyParam) => void }): Button1 | Button2 {
  return {
    label,
    action,
    hasActionParam: action.length === 1 ? true : false
  };
}

说明

  • action.length会返回函数声明时的形参数量:无参的action返回0,带一个MyParam参数的action返回1,以此区分两种按钮类型。
  • 该方案适用于当前场景,因为你明确限定了两种action的参数形式,不存在带默认值的参数或剩余参数的情况。如果后续扩展参数形式,可根据实际需求调整判断逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 04:42:10