如何从打字稿中的扩展功能返回此自类型

时间:2019-05-22 10:06:25

标签: typescript typescript-generics

我已经成功地在打字稿中实现了一些有效的扩展,但是我想返回这种类型而不是void。

interface Array<T> {
  pushAll(other: T[]): void

  randomize(): void
}

Array.prototype.pushAll = function <T>(other: T[]): void {
  this.push(...other)
}

Array.prototype.randomize = function (): void {
  this.sort(() => Math.random() * 2 - 1)
}

但是当我尝试它时会出现编译错误:

interface Array<T> {
  pushAll(other: T[]): this

  randomize(): this
}

Array.prototype.pushAll = function <T>(other: T[]): this {
  this.push(...other)
  return this
}

Array.prototype.randomize = function (): this {
  this.sort(() => Math.random() * 2 - 1)
  return this
}

错误:此类型仅在非静态时可用。 另外建议any[]不起作用。 我也很疲倦地将返回类型声明为T[],也没有运气。

我从诸如kotlin,swift,c#,objective-c之类的高级语言中获得打字稿,而这在绝对可能的情况下,因此我可以编写仍可以链接的具有类型安全性的函数。 谢谢。

(编辑) 我发现仅针对此情况和其他类似情况,返回Array<T>类型的解决方法。但是我只能在原型函数定义中定义返回值并在接口中实现并实现它。.

2 个答案:

答案 0 :(得分:1)

解决方案是从定义中完全删除类型。由于typescript已经知道了接口声明中的类型,因此它们将通过contextual typing应用于您的定义。

因此,您的示例如下所示:

interface Array<T> {
  pushAll(other: T[]): this
  randomize(): this
}

Array.prototype.pushAll = function (other) {
  this.push(...other)
  return this
}

Array.prototype.randomize = function () {
  this.sort(() => Math.random() * 2 - 1)
  return this
}

答案 1 :(得分:0)

这是解决方法,但并非我要寻找的完全。

interface Array<T> {
  pushAll(other: T[]): Array<T>

  randomize(): Array<T>
}

Array.prototype.pushAll = function <T>(other: T[]): Array<T> {
  this.push(...other)
  return this
}

Array.prototype.randomize = function <T>(): Array<T> {
  this.sort(() => Math.random() * 2 - 1)
  return this
}