【问题标题】:How do I convert use of `arguments` in javascript in Typescript如何在 Typescript 中转换 javascript 中“参数”的使用
【发布时间】:2016-09-24 01:39:47
【问题描述】:

我有一个数组。我想添加一个在数组上调用 push 时调用的方法。

如何在打字稿中写出来?

我试过了:

 addEvent(myArray) {
    let _this = this;
    myArray.push = function() {
        Array.prototype.push.apply(myArray, arguments);
        _this.onAddItem(arguments);
    };
}

它给出一个编译时错误:提供的参数与调用目标的任何签名都不匹配,预期为 0,用两个调用。

我不明白它在说什么。

【问题讨论】:

  • 是的,这就是我得到示例的地方。但我不能让它在 Typescript 中工作。所以我的问题是如何在 Typescript 中使用。
  • 你没有返回你的apply。保持冷静,仔细看看另一篇文章中的答案。

标签: javascript typescript


【解决方案1】:

不是使用arguments,而是使用更多的 TS 方法(通常是更好的 ES2015 方法)是使用休息参数。我不完全确定您要做什么,但您可以使用这样的休息参数:

addEvent(myArray) {
   // use an arrow function so you can avoid creating _this
   myArray.push = (...args: any[]) => {
        Array.prototype.push.apply(myArray, args);
        this.onAddItem(arguments);
    };
}

然后你可以像这样拨打addEvent

let arrayLikeObject = new SomeObjecct();
myObj.addEvent(arrayLikeObject);

arrayLikeObject.push(1, 2, 3);

但是,这种方法有些地方不太对劲。使用 TS,您应该在参数上提供更严格的类型注释。 myArray 是什么类型?它接受什么类型的参数?这应该明确说明。如果事实证明它可以接受多种类型,那么这也表明设计不佳。


编辑

现在我知道你要做什么了,我可以看到函数声明应该更像这样:

    (myArray as any[]).push = (...args: any[]): number => {
        Array.prototype.push.apply(myArray, args);
        this.onAddItem(arguments);
        return myArray.length;
    };

【讨论】:

  • myArrayArray<any>
  • 但是我在Array.prototype.push.apply(myArray, args);上仍然得到同样的错误编译错误
  • 我只想在一个项目被添加到数组时得到通知,所以我可以装饰这个项目。
  • 您应该使用any[] 作为类型,那么。并且推送的类型需要返回一个数字。
  • Array.prototype.push 返回数组的新长度。为了在语义上兼容,您的函数必须这样做。 developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
猜你喜欢
  • 1970-01-01
  • 2022-01-03
  • 2018-12-17
  • 2020-03-20
  • 1970-01-01
  • 2021-10-27
  • 2021-04-24
  • 1970-01-01
  • 2021-02-06
相关资源
最近更新 更多