Расширить функцию машинописного текста до вызываемого объекта

Я хотел бы расширить Mocha describe функцией forUsers, которая создала бы несколько описаний. По одному на каждого пользователя.

Исходное описание определения:

interface IContextDefinition {
    (description: string, callback: (this: ISuiteCallbackContext) => void): ISuite;
    only(description: string, callback: (this: ISuiteCallbackContext) => void): ISuite;
    skip(description: string, callback: (this: ISuiteCallbackContext) => void): void;
    timeout(ms: number): void;
}

Мое расширение:

declare namespace Mocha {
    interface IContextDefinition {
        forUsers(description: string, users: userType[], callback: (this: ISuiteCallbackContext, user: Cypress.userType) => void): void
        only: {
            (description: string, callback: (this: ISuiteCallbackContext) => void): ISuite
            forUsers(description: string, users: userType[], callback: (this: ISuiteCallbackContext, user: userType) => void): void
        }
        skip: {
            (description: string, callback: (this: ISuiteCallbackContext) => void): ISuite
            forUsers(description: string, users: userType[], callback: (this: ISuiteCallbackContext, user: userType) => void): void
        }
    }
}

Но я получаю эту ошибку:

Subsequent property declarations must have the same type.  Property 'only' must be of type '(description: string, callback: (this: ISuiteCallbackContext) => void) => ISuite', but here has type '{ (description: string, callback: (this: ISuiteCallbackContext) => void): ISuite; forUsers(description: string, users: userType[], callback: (this: ISuiteCallbackContext, user: userType) => void): void; }'.

Этот only, может быть только исходного типа, даже если новый тип включает старый.


person Akxe    schedule 09.10.2018    source источник
comment
почему вы пытаетесь перезаписать определение? если вы просто определяете свое собственное определение в своем пространстве имен, я думаю, что лучше   -  person mtizziani    schedule 09.10.2018
comment
Файлы имеют ограниченную область видимости, что означает, что переменные не являются общими, если они не экспортируются, и, поскольку я не хочу, чтобы другие импортировали эту функцию, объявление describe.forUsers звучало как лучшее место для этого.   -  person Akxe    schedule 10.10.2018


Ответы (1)


Правильно, если свойство имеет жестко запрограммированный тип (в отличие от интерфейса, который вы можете расширить), вы не можете изменить тип. Если вы действительно хотите изменить тип only, а не переделывать расширение API таким образом, чтобы его можно было объявить с помощью дополнения, тогда вам нужно будет форкнуть объявления типа Mocha; см. этот ответ, чтобы узнать о возможных способах этого сделать.

person Matt McCutchen    schedule 10.10.2018