You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Typescript中<E extends Node = HTMLElement>含义及与<E extends HTMLElement>的区别

Cypress自定义命令泛型类型解析

先看你给出的Cypress自定义命令代码:

Cypress.Commands.add(
  'byTestId',
  // Borrow the signature from cy.get
  <E extends Node = HTMLElement>(
    id: string,
    options?: Partial<
      Cypress.Loggable & Cypress.Timeoutable & Cypress.Withinable & Cypress.Shadow
    >,
  ): Cypress.Chainable<JQuery<E>> =
    cy.get(`[data-testid="${id}"]`, options),
);

1. <E extends Node = HTMLElement>的含义

这是TypeScript泛型的约束+默认类型写法:

  • <E>:声明一个泛型参数E,用来指定命令返回的DOM节点类型
  • extends Node:约束E必须是Node类型或它的子类型——Node是所有DOM节点的基类,包含HTML元素、文本节点、注释节点等
  • = HTMLElement:给泛型设置默认类型,当调用byTestId时没有显式指定E的类型,就默认使用HTMLElement(普通HTML元素类型)

2. 能否替换为<E extends HTMLElement>?两者有差异吗?

可以替换,但两者存在明显差异:

  • 原写法灵活性更高:允许E是任意Node子类型,比如你需要获取文本节点时,可以显式指定cy.byTestId<TextNode>('text-node-id'),同时默认场景下还是用HTMLElement,和cy.get的类型设计保持一致(注释里的"Borrow the signature from cy.get"就是这个原因)
  • 替换后的写法更严格:限制E只能是HTMLElement或它的子类型(比如HTMLDivElement、HTMLInputElement),无法支持非元素类型的DOM节点
  • 适用场景区别:如果你的测试中只会用这个命令获取HTML元素,替换后不会影响正常使用,但会丢失处理其他DOM节点的能力

内容的提问来源于stack exchange,提问作者mismas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 19:25:42