打字稿参数数量错误

Posted

技术标签:

【中文标题】打字稿参数数量错误【英文标题】:Typescript number of arguments error 【发布时间】:2017-07-18 12:20:42 【问题描述】:

快速提问,我相信有人会快速回答这个问题。

我正在尝试使用文档。

document.createElement("button", "option");

typescript 由于第二个参数不喜欢这样,它抱怨它只期望一个参数而不是两个参数被传递。在 vanilla JS 中,两个参数是可以接受的。

如何让 typescript 编译器允许这样做?

【问题讨论】:

【参考方案1】:

看起来标准定义不允许这样做,而且似乎是错误的。

我想 github 上的一个 bug 应该是有序的。

与此同时,您可以将函数保存为另一种类型。例如。

let createElement: (tagname: string, options: string) => htmlElementTagNameMap = document.createElement;

【讨论】:

确实,您的解决方案要好得多。 :) 不过,我发现的唯一相关问题是#574。我们可以从一个新问题中受益。【参考方案2】:

根据the standard,第二个参数应该是具有单个is 属性的对象,而不是字符串。因此,理论上,该行应该是:

document.createElement("button",  is: "option" );

字符串的使用是旧规范的一部分,已被弃用,尽管 Chrome 支持。

无论如何,该重载不在lib.d.ts 中,因此您需要overload that definition yourself as @NitzanTomer describes 和/或创建an issue at TypeScript's GitHub repo explaining the issue。

请注意,您尝试使用的 createElement 的重载是 Custom Elements 规范的一部分,在撰写本文时该规范是工作草案,因此 TypeScript 维护者可能不支持将其添加到 lib.d .ts.

【讨论】:

【参考方案3】:

定义中缺少它,但您可以轻松添加它:

interface Document 
    createElement(tagName: string, options?: string |  is: string );

如果您使用的是模块系统(您导入/导出),那么您需要这样做:

declare global 
    interface Document 
        createElement(tagName: string, options?: string |  is: string );
    

【讨论】:

是的,使用界面并将选项声明为可选已经解决了这个问题,我有点尴尬我自己没有想到这一点,但非常感谢@Nitzan 你真的挖了我走出角落

以上是关于打字稿参数数量错误的主要内容,如果未能解决你的问题,请参考以下文章

打字稿错误:预期 0-1 个参数,但得到 2 个

打字稿错误 TS2345 错误:TS2345:“缓冲区”类型的参数不可分配给“字符串”类型的参数

错误:参数“e”隐式具有“任何”类型。 TS7006 - 反应打字稿

错误:TS2345:使用打字稿编译时

映射打字稿参数:绑定元素“列”隐式具有“任何”类型

打字稿,如何使用类作为参数的类型