如何为带有额外属性的函数foo编写TypeScript类型?
为兼具调用能力与额外属性的函数定义TypeScript类型
你可以通过两种方式定义foo的类型,匹配它既作为函数可调用、又拥有boo属性的特性:
方法一:使用接口定义调用签名与属性
通过接口同时声明函数的调用签名(作为函数被调用时的参数和返回值类型)和额外属性:
interface FooType { // 定义foo本身作为函数的调用签名 (arg: string): void; // 定义foo的boo属性类型 boo: (arg: string) => void; } // 实现foo函数并指定类型 const foo: FooType = function(arg: string) { // 这里写foo的逻辑 } as FooType; // 实现foo.boo foo.boo = (arg: string) => { // 这里写boo的逻辑 }; // 正常调用,类型检查会生效 foo("hello"); foo.boo("hello");
方法二:使用交叉类型
将函数类型与包含boo属性的对象类型交叉,同样能实现需求:
// 交叉函数类型和对象类型 type FooType = ((arg: string) => void) & { boo: (arg: string) => void; }; const foo: FooType = function(arg: string) { // foo的逻辑实现 } as FooType; foo.boo = (arg: string) => { // boo的逻辑实现 }; // 类型检查下的合法调用 foo("hello"); foo.boo("hello");
这两种方式都能让TypeScript正确识别foo的双重特性,既允许像普通函数一样调用,也能访问并调用它的boo属性。
内容的提问来源于stack exchange,提问作者Alessandro Catania
相关产品推荐
相关产品推荐

