جاوااسکریپت - چگونه نوع داده را به تابع alias در Cypress.as متصل کنیم


من یک شیء دارم که از آن یک نام مستعار به نام userId ایجاد میکنم

cy.wrap(response.id).as('userId');

هنگام ارجاع به userId، نوع آن JQuery<HTMLElement> است

cy.get('@userId').then(userId => // userId type is JQuery<HTMLElement> });

چگونه میتوان نوع مستعار را هنگام تعریف مستعار تعریف کرد؟

قصد این است که آن را مستقیماً به عنوان number داشته باشیم به جای پیشفرض JQuery<HTMLElement>

ویرایش

من چیزی مثل این نمیخواهم

cy.get<number>('@userId').then(userId => // userId type is number });

من میخواهم نوع را در تعریف تابع مشخص کنم.

پاسخ شماره ۱

مشکل مربوط به این دو تعریف نوع در cypress.d.ts است

// cypress.d.ts

/**
 * Get one or more DOM elements by selector.
 * The querying behavior of this command matches exactly how $(…) works in jQuery.
 * @see https://on.cypress.io/get
 * @example
 *    cy.get('.list>li')    // Yield the <li>'s in <.list>
 *    cy.get('ul li:first').should('have.class', 'active')
 *    cy.get('.dropdown-menu').click()
 */
get<E extends Node = HTMLElement>(
  selector: string, 
  options?: Partial<Loggable & Timeoutable & Withinable & Shadow>)
  : Chainable<JQuery<E>>

/**
 * 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 & Timeoutable & Withinable & Shadow>)
  : Chainable<S>

شما میتوانید با معکوس کردن ترتیب، آن را «رفع» کنید،

// cypress/support/index.ts

declare global {
  namespace Cypress {
    interface Chainable<Subject> {
      // change the order of these two dfns
      get<S = any>(alias: string, options?: Partial<Loggable & Timeoutable & Withinable & Shadow>): Chainable<S>
      get<E extends Node = HTMLElement>(selector: string, options?: Partial<Loggable & Timeoutable & Withinable & Shadow>): Chainable<JQuery<E>>
    }
  }
}

حال cy.get('@alias') به any تایپ میشود (به دلیل get<S=any>)، که معتبر است زیرا نام مستعار هر نوعی را ذخیره میکند.

اما به نظر میرسد نسخه selector نیز به any تایپ میشود، به نظر میرسد امضاهای نوع یکسان یکی از تعاریف را زائد میکند.

همانطور که میخائیل بولوتوف اشاره میکند، یک نام دستور متفاوت مشکل را حل میکند، اما من آن را به عنوان یک دستور سفارشی در /cypress/support/index.ts تعریف میکنم و آن را getAlias مینامم چون باید برای هر نوعی کار کند.

پاسخ شماره ۲

تا آنجا که من میدانم، غیرممکن است که نوع را از تعریف نام مستعار به ارجاع نام مستعار استخراج کرد. اما میتوانید آن را مستقیماً روی ارجاع تعریف کنید (فقط در یک فایل تایپاسکریپت کار میکند):

cy.get<number>('@userId').then(userId => // userId type is number });

شما همچنین میتوانید یک تابع ساده استخراج کنید (یا یک فرمان سفارشی Cypress اضافه کنید) برای چنین نام مستعاری عددی:

function cyNumber(alias: string) : Chainable<number> {
  return cy.get<number>(alias)
}

cyNumber('@userId').then(userId => // userId type is number });