我已经成功地在打字稿中实现了一些有效的扩展,但是我想返回这种类型而不是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>
类型的解决方法。但是我只能在原型函数定义中定义返回值并在接口中实现并实现它。.
答案 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
}