TS2339: Свойство «имя пользователя» не существует для типа » jQuery». При использовании светильников Cypress

#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) => в значительной степени эквивалентно.