Объявление модуля с одинаковым именем для свойства и функции

Я пишу определения для существующей библиотеки функциональных модулей, которая предоставляет следующий API:

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

О слиянии объявлений я узнал здесь. Где что-то говорится о многократном объявлении функции с одним и тем же именем для перегрузок. Но там ничего не говорится о написании типов для функции и свойства, живущих в одном месте.

Тем не менее я попытался написать:

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

Но, как и ожидалось, компилятор жалуется: Subsequent property declarations must have the same type.

Могу ли я что-нибудь с этим сделать?

В случае необходимости библиотека markdown-pdf.


person MonsieurMan    schedule 06.08.2018    source источник


Ответы (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

Ссылка на игровую площадку

Если вы хотите, чтобы пользователи модуля могли добавлять перегрузки к функции 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

Ссылка на игровую площадку

person Titian Cernicova-Dragomir    schedule 06.08.2018
comment
О точно! Я забыл о типе пересечения, потому что это была функция, но да, функция — это тип. Спасибо ! - person MonsieurMan; 06.08.2018