Typescript: Herencia de matriz en el archivo de declaración de ES6 (lib.es6.d.ts)

Creado en 13 sept. 2016  ·  3Comentarios  ·  Fuente: microsoft/TypeScript

ES6 admite la herencia de matrices, pero esto no se refleja en el archivo de declaración de TypeScript (lib.es6.d.ts).

Las funciones de matriz como 'filtro' y 'segmento' devuelven una matriz de la subclase, por lo que lo siguiente debería compilarse en TypeScript:

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

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

Las funciones 'reverse', 'concat', 'slice', 'splice', 'filter' deberían regresar con el tipo 'this'.
La función 'mapa' también devuelve una instancia del subtipo, pero no sé cómo podría representarse en TypeScript, ya que requeriría un parámetro genérico en el tipo de retorno, algo como:
map<U>(callback: (value: T, index: number, array: this) => U): this<U>

Otro problema son los constructores estáticos de la clase Array, esto también debería compilarse:

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

También hay algunas complicaciones adicionales agregadas por el símbolo @ @species , que se puede usar para cambiar la firma de tipo de la subclase para no usar 'this' como valor de retorno para funciones como 'filter' y 'slice'. Entonces, para el siguiente ejemplo, la subclase funcionaría como se definen los tipos de retorno en el archivo de declaración actualmente:

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

Chrome y Node.js ya implementan las características de herencia de matrices que se muestran aquí.

lib.d.ts Suggestion help wanted

Comentario más útil

las funciones estáticas se pueden resolver haciendo de Array una clase. el problema es que necesitamos tener una forma de describir un constructor invocable (https://github.com/Microsoft/TypeScript/issues/183), ya que Array también se puede llamar como una función. desafortunadamente, esta propuesta se ha estancado en TC39, pero podemos hacer una versión de la misma para declaraciones ambientales. Creo que esto debería rastrearse por separado.

para el resto, debería ser posible agregar this en lugar de T[] . Creo que sort ya hace esto.

Todos 3 comentarios

Esto va a ser difícil, porque TypeScript actualmente no permite la reasignación de genéricos en this polimórficos. Consulte el n. ° 6223 (del que este problema podría considerarse un engaño).

El problema es que si en una subclase introduce una ranura genérica diferente, ¿cómo funciona el this polimórfico? Por ejemplo, crea una subclase que solo trata con matrices de matrices, donde el genérico T se usó de esta manera T[][] . Pero la ranura genérica en Array this sería T[] , ¿cómo se expresa eso de una manera que siempre funcione?

También hay más ejemplos en el problema mencionado anteriormente de dónde esto polimórfico se rompe cuando se combina con genéricos.

El problema con 'map' es de hecho el mismo que el discutido en "Polymorphic 'this' and Generics", pero todos los demás métodos Array problemáticos podrían funcionar correctamente simplemente devolviendo 'this'.

Y los métodos Array.from y Array.of producen un problema separado, que también es imposible de representar con la sintaxis actual de TypeScript hasta donde yo sé, porque la interfaz ArrayConstructor tendría que poder referirse al 'esto' de Array interfaz.

las funciones estáticas se pueden resolver haciendo de Array una clase. el problema es que necesitamos tener una forma de describir un constructor invocable (https://github.com/Microsoft/TypeScript/issues/183), ya que Array también se puede llamar como una función. desafortunadamente, esta propuesta se ha estancado en TC39, pero podemos hacer una versión de la misma para declaraciones ambientales. Creo que esto debería rastrearse por separado.

para el resto, debería ser posible agregar this en lugar de T[] . Creo que sort ya hace esto.

¿Fue útil esta página
0 / 5 - 0 calificaciones