#jquery #typescript #cypress
Вопрос:
Я новичок в использовании TypeScript, я пытаюсь преобразовать свои тесты Cypress в TS, но у меня возникают проблемы всякий раз, когда я читаю из файла fixtures, я получаю ошибку, например
TS2339: Свойство «имя пользователя» не существует для типа «jQuery».
Примером того, когда я получаю ошибку, является:
cy.fixture("details").as("details");
cy.get("@details").then((users) => {
const user: string = users.username;
Я могу запустить его, если сделаю пользователей любого типа, например
.затем((пользователи: любые)
но я знаю, что это не лучший способ обойти это.
Я видел пару других вопросов с аналогичной ошибкой, но я не уверен, как заставить эти решения работать с Cypress, может ли кто-нибудь предложить что-нибудь, что могло бы помочь?
Ответ №1:
Во-первых, вам нужно определить тип для вашей пользовательской структуры, что-то вроде этого:
class User {
username: string
}
После этого вы можете ссылаться на этот тип при запросе значения псевдонима (обратите внимание на выражение get<User><Пользователь>).:
cy.get<User>("@details").then((users) => {
const user = users.username;
}
Комментарии:
1. могу я спросить, откуда вы получаете эту информацию, кроме проверки источников определения типов? Это работает, мне просто интересно, есть ли какие — либо документы помимо официального определения API на их веб-сайте, потому что об
as<T>()
интерфейсе ничего не сказано.2. Я действительно получаю эту информацию из источников определения типа (просто потому, что я подозревал, что она должна быть там). Если вас интересуют базовые знания, вы можете обратиться к теме TS generics: typescriptlang.org/docs/handbook/2/generics.html
Ответ №2:
cypress.d.ts
Там interface Chainable
есть, что включает в себя это определение get(alias)
синтаксиса
/**
* Get one or more DOM elements by alias.
* @see https://on.cypress.io/get#Alias
* @example
* // Get the aliased ‘todos’ elements
* cy.get('ul#todos').as('todos')
* //...hack hack hack...
* //later retrieve the todos
* cy.get('@todos')
*/
get<S = any>(alias: string, options?: Partial<Loggable amp; Timeoutable amp; Withinable amp; Shadow>): Chainable<S>
По какой-то причине это не обнаруживается в тестах, но вы можете исправить это в
/// <reference types="cypress" />
// Add type definition in test file or /cypress/support/index.ts
declare namespace Cypress {
interface Chainable {
get<S = any>(alias: string, options?: Partial<Loggable amp; Timeoutable amp; Withinable amp; Shadow>): Chainable<S>
}
}
it('sees the get(alias) type def', () => {
cy.fixture("example").as("details") // using example fixture installed by Cypress
cy.get("@details").then((user) => {
const name: string = user.name // no error
const email: string = user.email // no error
})
})
Если вы просто хотите ввести как универсальный объект, используйте Cypress.ObjectLike
, определенный в cypress.d.ts
качестве
interface ObjectLike {
[key: string]: any
}
Использовать в тесте как
/// <reference types="cypress" />
cy.get<Cypress.ObjectLike>("@details").then((user) => {
const name: string = user.username;
})
Примечание
Dfn Cypress для псевдонима имеет универсальный тип get<S = any>
, поэтому ваше решение .then((users: any) =>
в значительной степени эквивалентно.