如何为以下库模式添加 TypeScript 类型?
How to add TypeScript typings for the following library pattern?
我有一个 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;
问题是现在使用该库的任何人,如果他们想使用基于 promise 的版本,就必须转换为 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
。
接受回调或returns承诺的函数可以使用重载很好地处理:
declare class Foo {
static frob(callback: (result: string) => void): void;
static frob(): Promise<string>;
}
在其他更复杂的情况下,可能没有比问题中概述的泛型和导出类型更好的解决方案了。
我有一个 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;
问题是现在使用该库的任何人,如果他们想使用基于 promise 的版本,就必须转换为 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
。
接受回调或returns承诺的函数可以使用重载很好地处理:
declare class Foo {
static frob(callback: (result: string) => void): void;
static frob(): Promise<string>;
}
在其他更复杂的情况下,可能没有比问题中概述的泛型和导出类型更好的解决方案了。