Я новичок в 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?