我有一个JavaScript库(让我们称之为foo
),简化后看起来像这样:
class Foo {
static frob(cb) {
const result = 'frobbed';
if (cb) return cb(result);
return Promise.resolve(result);
}
}
module.exports = Foo;
在我的index.d.ts
中,我提出以下内容:
type FrobCallback = (result: string) => void;
type FrobPromise = Promise<string>;
type FrobReturnType = FrobPromise | void;
declare class Foo {
static frob(callback: (result: string) => void): FrobReturnType;
}
export = Foo;
问题在于,现在使用该库的人,如果他们想要使用基于承诺的版本,则必须强制转换为FrobPromise
,并且可以使用该类型以避免重复Promise<string>
。
我不能说export type FrobPromise = Promise<string>
,因为这会触发 TS2093:导出分配不能在带有其他导出元素的模块中使用错误消息。
因此,我不得不求助于创建另一个文件,让我们称之为types.d.ts
,导出FrobPromise
,我最终可以像这样使用我的库:
import Foo = require('foo');
import { FrobPromise } from 'foo/types';
(Foo.frob() as FrobPromise).then(result => console.log(result.length);
是否有某种方法可以为上述声明获得更好的符号?似乎应该有一个更优雅的解决方案来解决我所描述的问题。除了添加输入法之外,我无法控制foo
。
答案 0 :(得分:0)
使用重载可以很好地处理接受回调或返回promise的函数:
declare class Foo {
static frob(callback: (result: string) => void): void;
static frob(): Promise<string>;
}
在其他更复杂的情况下,可能没有比问题中所述的泛型和导出类型更好的解决方案。