Можно ли связывать дженерики в пользовательских цепочках команд Cypress? - PullRequest
0 голосов
/ 12 февраля 2020

Я новичок в Typescript. До переключения js -> ts я много делал

cy.request('GET', '/foo')
.its('body.bar')
// etc

Теперь его строка (понятно) выдаст ошибку машинописного текста, потому что это своего рода составной строковый литерал, поэтому keyof недостаточно.

Мой код в настоящее время выглядит примерно так

export interface TypedResponse<BodyType extends BodyType> {
    body: BodyType
};

export interface BodyType {
    [key: string]: any
}

export interface FooBodyType extends BodyType {
    bar: number
}


cy.request('GET', '/foo') as Cypress.Chainable<TypedResponse<FooBodyType>>
.its('body')
.its('bar')
// etc

Но я бы предпочел сделать свою собственную перегрузку (в основном из-за того, как its влияет на форматирование результатов), что-то как:

Cypress.Commands.add('itsBody', {prevSubject: true}, 
    <T extends BodyType, K extends keyof T['body']>(subject: T, bodyPropertyName: K, options?: any):    Cypress.Chainable<T['body'][K]> => {
    // @ts-ignore
    return cy.wrap(subject).its(`body.${bodyPropertyName}`, options);
});

Проблема в том, что из-за того, что параметр Cypress меняет пользовательские команды, моя версия index.d.ts не имеет параметра субъекта, и поэтому нет способа принудительно установить, что пользователь не ' .itsBody('nonexistent')

Я думаю, что, возможно, есть способ обойти это, учитывая, насколько Cypress полагается на цепочку ... Я просто не могу понять, как получить T из возвращаемого типа предыдущей команды в цепочке. Может быть, такое возможно в ванильном TypeScript, но не в Cypress?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...