【问题标题】:Module declaration with same name for property and function属性和函数同名的模块声明
【发布时间】:2018-08-06 08:15:09
【问题描述】:

我正在为现有的功能模块库编写定义,该库公开了以下 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

【问题讨论】:

    标签: typescript typescript-typings


    【解决方案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

    【讨论】:

    • 哦,当然!我忘记了交集类型,因为它是一个函数,但是,一个函数是一个类型。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2013-09-17
    • 1970-01-01
    • 1970-01-01
    • 2012-05-28
    • 2021-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多