属性和功能具有相同名称的模块声明

时间:2018-08-06 08:15:10

标签: typescript typescript-typings

我正在为现有功能模块库编写定义,该库公开了以下API:

fn().from(opts: Options)
// and
fn().from.string(path: String)

我发现有关声明合并here的事情。它在何处说明了多次声明一个具有相同名称的重载函数。但这并没有说明为同一个地方的函数和属性编写类型。

尽管如此,我还是尝试写:

export interface Test {
    from(path: string): ToOptionsBuilder;
}
export interface Test {
    from: FromOptionsBuilder;
}

但是,正如预期的那样,编译器抱怨:Subsequent property declarations must have the same type.

我能做些什么吗?

如果需要,该库为markdown-pdf

1 个答案:

答案 0 :(得分:1)

您不能对字段使用声明合并。您可以使用函数签名和FromOptionsBuilder接口之间的交集类型来声明该字段符合所需的声明:

export interface Test {
    from: FromOptionsBuilder & {
        (path: string): ToOptionsBuilder;
    };
}

//Test
interface FromOptionsBuilder { fromField : number }
interface ToOptionsBuilder { toField: number}
declare let t: Test;
t.from.fromField
t.from("").toField

Playground link

如果您希望模块的用户能够向from函数添加重载,则可以使用一个额外的接口作为其他人可以在以下位置合并其重载的接口:

export interface Test {
    from: IFormFunction
}

export interface IFormFunction extends FromOptionsBuilder {
    (path: string): ToOptionsBuilder;
}
//Extended overload 
export interface IFormFunction  {
    (path: string, otherValue: string): ToOptionsBuilder;
}
//Test
interface FromOptionsBuilder { fromField : number }
interface ToOptionsBuilder { toField: number}
declare let t: Test;
t.from.fromField
t.from("").toField
t.from("", "").toField

Playground link