【问题标题】:Typescript: Named property type must be assignable to string indexer type打字稿:命名属性类型必须可分配给字符串索引器类型
【发布时间】:2018-02-23 02:26:30
【问题描述】:

我只是一个继承了一些 TypeScript 代码的可怜程序员。有时你只是想知道发生了什么,而不需要花几周的时间来流利地使用一门新语言。我有一个界面:

interface IJQuery {
    addRecordInline(object: any);
}

我在 addRecordInline 上遇到错误:

“命名属性类型 '(object any) => any' 必须可分配给字符串索引器类型 'HTMLElement':类型 'HTMLElement' 具有非可选属性 'accessKey',它在类型 '(object any) 中不存在=> 任何'

任何关于正在发生的事情的线索都将不胜感激。我浏览了互联网......有一些关于索引器的帖子似乎最接近。但是这里发生了什么?只是指向一些信息的指针。谢谢。

编辑:

正在实现的接口示例:

interface IDocumentManager {
    UpdateForm: IJQuery;
    UpdateActionUrl: string;
    DocIdPrefix: string;
}

第二次编辑:

这是一个实现接口的类:

class MemberDocumentManager implements IDocumentManager {
    private ConfirmDeleteButton: IJQuery;
    // other declarations removed

    constructor() {
        this.ConfirmDeleteButton = $('#deleteConfirmButton');
    }
}

一个 JQuery 对象被分配给一个实现相关接口的成员,这是问题所在吗?

【问题讨论】:

  • 你在哪里实现那个接口?
  • 据我所知,该接口已分配给其他接口的成员:“接口 IDocumentManager { UpdateForm: IJQuery; } 和其他相同的情况。
  • 代码还是太少了。错误是类型和值不匹配,所以我们需要查看值(你实现了吗)

标签: javascript typescript


【解决方案1】:

根据错误,这不是IJQuery 的唯一定义。据我所知,这是特定于您的项目的,不属于 JQuery 库。

形成错误,IJQuery 的定义可能包含一个索引器:

interface IJQuery {
    [name: string]: HTMLElement
}

这意味着在这个类型上定义的所有属性都必须是HTMLElement类型

interface IJQuery {
    addRecordInline(object: any) : void; // Not ok
    anElement: HTMLElement // OK
}

您可以通过删除索引器 ([name: string]: HTMLElement) 来放松限制,或者在另一个接口上定义方法或更改索引器以返回元素或函数 ([name: string]: HTMLElement | Function)(尽管这可能会破坏您的代码在几个地方)

【讨论】:

  • 在我看来,接口 IJQuery 的定义与 bootstratp.d.ts 和 jquery.d.ts 甚至 jquery.uploadify.d.ts 中定义的同一接口的声明相冲突.当我将接口名称更改为 IJQuery2 时,错误似乎已解决。似乎是一个合理的解释?
  • @Evan 我在 JQuery 的类型中没有找到它,但可以肯定它与另一个定义冲突
  • Titian:你能补充更多关于如何完成这个接口合并的细节吗?我无法更改原始的 JQuery 界面,但我将如何合并一个新界面,我是否必须让所有新成员都是 HTMLElement 类型?
猜你喜欢
  • 2016-10-25
  • 2022-01-17
  • 2020-02-07
  • 1970-01-01
  • 2021-11-10
  • 1970-01-01
  • 2019-07-12
  • 1970-01-01
  • 2021-10-11
相关资源
最近更新 更多