如何为以下库模式添加TypeScript类型?

时间:2017-06-28 11:44:27

标签: typescript typescript-typings

我有一个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

1 个答案:

答案 0 :(得分:0)

使用重载可以很好地处理接受回调或返回promise的函数:

declare class Foo {
  static frob(callback: (result: string) => void): void;
  static frob(): Promise<string>;
}

在其他更复杂的情况下,可能没有比问题中所述的泛型和导出类型更好的解决方案。