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

如何从可调用类型Foo<T>中移除length属性且保持可调用性?

如何移除函数类型的length属性并保留可调用性?

我定义了如下类型:

export type Foo<T> = (() => T)

想移除该类型中的length属性,同时保持它的可调用性,但直接使用Omit<(() => T), 'length'>会导致类型失去可调用性,该怎么解决?


可以通过显式保留调用签名的方式实现需求,这里提供两种可行的写法:

写法一:结合调用签名与Omit

export type Foo<T> = {
  (): T; // 显式声明调用签名,确保可调用性
} & Omit<(() => T), 'length'>;

写法二:通过交叉类型屏蔽length属性

export type Foo<T> = (() => T) & { length?: never };

这两种方式定义的Foo<T>都能像普通函数一样被调用,同时TypeScript会认定它不存在length属性。


至于为什么直接用Omit<(() => T), 'length'>会失效:
TypeScript里的函数类型是带调用签名的特殊对象类型,但Omit工具类型处理函数类型时,会将其转换为普通对象类型,原本的调用签名会被丢失,最终得到的类型自然就失去了可调用性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 12:33:11