Typescript: ES6声明文件(lib.es6.d.ts)中的数组继承

创建于 2016-09-13  ·  3评论  ·  资料来源: microsoft/TypeScript

ES6支持数组继承,但是不会在TypeScript声明文件(lib.es6.d.ts)中反映出来。

数组函数(例如“ filter”和“ slice”)返回子类的数组,因此以下内容应在TypeScript中进行编译:

class MyArray extends Array {
    get size() { return this.length; }
}

var x = new MyArray(10).slice();
x.size;

函数“ reverse”,“ concat”,“ slice”,“ splice”,“ filter”应返回“ this”类型。
'map'函数也返回该子类型的实例,但是我不知道该怎么用TypeScript表示,因为它需要返回类型中的通用参数,例如:
map<U>(callback: (value: T, index: number, array: this) => U): this<U>

另一个问题是Array类的静态构造函数,这也应该编译:

var x = MyArray.of(1,2,3);
var y = MyArray.from([1,2,3]);
x.size;
y.size;

@ @species符号还增加了一些其他复杂性,可用于更改子类的类型签名,以不将“ this”用作“ filter”和“ slice”等函数的返回值。 因此,对于以下示例,子类将有效地处理当前在声明文件中定义返回类型的方式:

class MyArray2 extends Array {
    static get [Symbol.species]() { return Array; }
}

Chrome和Node.js都已经实现了此处显示的数组继承功能。

lib.d.ts Suggestion help wanted

最有用的评论

静态函数可以通过使Array一个类来解决。 问题是我们需要一种方法来描述可调用的构造函数(https://github.com/Microsoft/TypeScript/issues/183),因为Array也可以作为函数来调用。 不幸的是,该提案已在TC39中停滞了,但是我们可以为环境声明做一个版本。 我认为这应该单独跟踪。

其余的,应该可以用this代替T[] 。 我相信sort已经做到了。

所有3条评论

这将很困难,因为TypeScript当前不允许在多态this上重新分配泛型。 请参阅#6223(此问题可能被认为是重复的)。

问题变成了,如果在子类中引入了另一个通用插槽,那么多态this工作? 例如,您创建一个仅处理数组数组的子类,其中以这种方式使用通用T T[][] 。 但是Arraythis的通用插槽将是T[] ,您如何以一种始终有效的方式表示这一点?

上面提到的问题中还有更多示例,以及与泛型结合使用时多态会崩溃的地方。

“ map”的问题确实与“多态的'this'和泛型”中讨论的问题相同,但是所有其他有问题的Array方法都可以通过简单地返回“ this”来正常工作。

而且Array.from和Array.of方法会产生一个单独的问题,就我所知,用当前的TypeScript语法也无法表示这个问题,因为ArrayConstructor接口必须能够引用Array的“ this”界面。

静态函数可以通过使Array一个类来解决。 问题是我们需要一种方法来描述可调用的构造函数(https://github.com/Microsoft/TypeScript/issues/183),因为Array也可以作为函数来调用。 不幸的是,该提案已在TC39中停滞了,但是我们可以为环境声明做一个版本。 我认为这应该单独跟踪。

其余的,应该可以用this代替T[] 。 我相信sort已经做到了。

此页面是否有帮助?
0 / 5 - 0 等级

相关问题

jbondc picture jbondc  ·  3评论

manekinekko picture manekinekko  ·  3评论

Zlatkovsky picture Zlatkovsky  ·  3评论

MartynasZilinskas picture MartynasZilinskas  ·  3评论

wmaurer picture wmaurer  ·  3评论