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

TypeScript调用签名疑问:参数如何同时为对象与函数?

如何在JavaScript中实现既是函数又是对象的参数

在JavaScript里,函数本身就是对象,所以你可以直接给函数添加额外属性,让它同时具备可调用性和属性存储能力,这刚好对应TypeScript里DescribableFunction的定义。

具体实现示例

// 定义函数并添加description属性
const myFunc = (a) => {
  return typeof a === 'number' && a > 5;
};
myFunc.description = "判断输入数字是否大于5";

// 接收该参数的函数
function doSomething(fn) {
  console.log(fn.description + " returned " + fn(6));
}

// 调用测试
doSomething(myFunc); // 输出:判断输入数字是否大于5 returned true

原理说明

JavaScript中的函数是Function类型的实例,而Function继承自Object,所以函数天生拥有对象的特性——可以动态添加、修改属性。TypeScript的DescribableFunction类型只是用类型系统约束了这种JavaScript原生特性:要求这个值既要符合指定的函数调用签名,又必须包含description字符串属性。

你提供的错误场景解析

  • 第一个错误:(()=>false)是普通函数,但没添加description属性,不符合TypeScript的类型约束;如果在JavaScript里直接调用,会因为fn.description为undefined,输出内容会变成undefined returned false。
  • 第二个错误:{description: 'test'}是普通对象,没有可调用的函数能力,调用fn(6)时会直接抛出TypeError: fn is not a function的错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 06:50:28