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
相关产品推荐
相关产品推荐

