Javascript 同时允许承诺和回调的函数的键入

Javascript 同时允许承诺和回调的函数的键入,javascript,typescript,Javascript,Typescript,我使用生成一个函数,默认情况下,该函数返回承诺,但也支持回调作为最后一个参数(这样就不会返回承诺)。如何在index.d.ts文件中编写适当的打字脚本来描述这一点 目前,我必须以函数重载的形式复制我的函数类型,以支持承诺: declare function someFunc(opts): Promise<any> declare function someFunc(opts: object, callback: (error: Error | null, result: any |

我使用生成一个函数,默认情况下,该函数返回承诺,但也支持回调作为最后一个参数(这样就不会返回承诺)。如何在
index.d.ts
文件中编写适当的打字脚本来描述这一点

目前,我必须以函数重载的形式复制我的函数类型,以支持承诺:

declare function someFunc(opts): Promise<any>
declare function someFunc(opts: object, callback: (error: Error | null, result: any | void) => any): void
声明函数someFunc(opts):Promise
声明函数someFunc(opts:object,callback:(error:error | null,result:any | void)=>any):void
当我在更大的项目中使用这个术语时,当我不得不通过输入两到三次来重命名时,它会增加一个很大的开发负担

实现这一目标的常规方法是什么?

你所说的,我认为它们是实现这一目标的常规方法

由于TS3.0左右,为了避免过载,您可以使用以下内容:

type Callback<T> = (error: Error | null, result: T | void) => any;
declare function someFunc2<C extends [Callback<any>] | []>(
    opts: object,
    ...[callback]: C
): C extends [Callback<any>] ? void : Promise<any>;

const promiseResult2 = someFunc2({});
const voidResult2 = someFunc2({}, (e, r) => r);
type Callback=(错误:error | null,结果:T | void)=>any;

声明函数somefunc2doE你的IDE不能帮你重命名东西吗?@Bergi确实可以,但那只是逃避问题。我认为没有问题。如果您想提供一个带有回调的重载,那么重复函数名是很自然的。