类型“HTMLFormControlsCollection”没有属性“x”并且没有字符串索引签名

Posted

技术标签:

【中文标题】类型“HTMLFormControlsCollection”没有属性“x”并且没有字符串索引签名【英文标题】:Type 'HTMLFormControlsCollection' has no property 'x' and no string index signature 【发布时间】:2018-09-11 15:18:20 【问题描述】:

尝试解构form.elements 对象时出现以下错误:

类型“htmlFormControlsCollection”没有属性“x”,也没有字符串索引签名

// in a class

domRefs: [key: string]: HTMLFormElement | null = 
  myForm: null


onButtonClick = () => 
  console.debug(this.domRefs.myForm!.elements) // screenshot below
  const a, b, c = this.domRefs.myForm!.elements

我不想使用不会发出此错误的: any 类型注释。

【问题讨论】:

我相信你很久以前就已经解决了 - 但只是为了其他读者的利益 - 像往常一样,罪魁祸首是标准定义库的限制,除了扩充之外别无他法HTMLFormControlsCollection 接口。 【参考方案1】:

这是标准 DOM 定义库的限制(在 2021 年仍然存在)。以下是 HTMLFormControlsCollection 在其中的定义方式 - 请注意缺少字符串索引签名(这正是发生错误的原因):

interface HTMLFormControlsCollection extends HTMLCollectionBase 
    /**
     * Returns the item with ID or name name from the collection.
     * 
     * If there are multiple matching items, then a RadioNodeList object containing all those elements is returned.
     */
    namedItem(name: string): RadioNodeList | Element | null;

它的父接口HTMLCollectionBase也缺少字符串索引签名(尽管有数字索引签名):

interface HTMLCollectionBase 
    /**
     * Sets or retrieves the number of objects in a collection.
     */
    readonly length: number;
    /**
     * Retrieves an object from various collections.
     */
    item(index: number): Element | null;
    [index: number]: Element;

但是,HTMLFormControlsCollection 根据定义应该有一个字符串索引签名(参见the standard):

元素 = 集合[名称] radioNodeList = 集合[名称] 从集合中返回具有 ID 或名称 name 的项目。

所以,在一些声明合并的帮助下,我们可以修复遗漏:

interface HTMLFormControlsCollection extends HTMLCollectionBase 
  [item: string]: Element | RadioNodeList;

【讨论】:

以上是关于类型“HTMLFormControlsCollection”没有属性“x”并且没有字符串索引签名的主要内容,如果未能解决你的问题,请参考以下文章

c#中值类型和引用类型的区别

MySQl数据类型

值类型和引用类型

TS 基本类型分类any 类型

MySQL数据类型 - 数字类型 - 数字类型语法

js简单类型与复杂类型