如何从可调用类型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
相关产品推荐
相关产品推荐

