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都已经实现了此处显示的数组继承功能。
这将很困难,因为TypeScript当前不允许在多态this
上重新分配泛型。 请参阅#6223(此问题可能被认为是重复的)。
问题变成了,如果在子类中引入了另一个通用插槽,那么多态this
工作? 例如,您创建一个仅处理数组数组的子类,其中以这种方式使用通用T
T[][]
。 但是Array
的this
的通用插槽将是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
已经做到了。
最有用的评论
静态函数可以通过使
Array
一个类来解决。 问题是我们需要一种方法来描述可调用的构造函数(https://github.com/Microsoft/TypeScript/issues/183),因为Array
也可以作为函数来调用。 不幸的是,该提案已在TC39中停滞了,但是我们可以为环境声明做一个版本。 我认为这应该单独跟踪。其余的,应该可以用
this
代替T[]
。 我相信sort
已经做到了。