Typescript: Herança de matriz no arquivo de declaração ES6 (lib.es6.d.ts)

Criado em 13 set. 2016  ·  3Comentários  ·  Fonte: microsoft/TypeScript

ES6 oferece suporte à herança de Array, mas isso não se reflete no arquivo de declaração do TypeScript (lib.es6.d.ts).

Funções de matriz como 'filtro' e 'fatia' retornam uma matriz da subclasse, portanto, o seguinte deve ser compilado no TypeScript:

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

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

As funções 'reverse', 'concat', 'slice', 'splice', 'filter' devem retornar com o tipo 'this'.
A função 'map' retorna uma instância do subtipo também, mas não sei como isso poderia ser representado no TypeScript, pois exigiria um parâmetro genérico no tipo de retorno, algo como:
map<U>(callback: (value: T, index: number, array: this) => U): this<U>

Outro problema são os construtores estáticos da classe Array, isso também deve ser compilado:

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

Existem também algumas complicações adicionais adicionadas pelo símbolo @ @species , que pode ser usado para alterar a assinatura de tipo da subclasse para não usar 'this' como o valor de retorno para funções como 'filter' e 'slice'. Portanto, para o exemplo a seguir, a subclasse funcionaria como os tipos de retorno são definidos no arquivo de declaração atualmente:

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

O Chrome e o Node.js já implementam os recursos de herança de array mostrados aqui.

lib.d.ts Suggestion help wanted

Comentários muito úteis

as funções estáticas podem ser resolvidas tornando Array uma classe. o problema é que precisamos encontrar uma maneira de descrever um construtor chamável (https://github.com/Microsoft/TypeScript/issues/183), já que Array também pode ser chamado como uma função. infelizmente, esta proposta travou no TC39, mas podemos fazer uma versão dela para declarações ambientais. Acho que isso deve ser rastreado separadamente.

para o resto, deve ser possível adicionar this no lugar de T[] . Eu acredito que sort já faz isso.

Todos 3 comentários

Isso vai ser difícil, porque o TypeScript não permite atualmente o re-alocação de genéricos no polimórfico this . Veja # 6223 (este problema pode ser considerado um idiota).

O problema é se em uma subclasse você introduzir um slot genérico diferente, como o polimórfico this funciona? Por exemplo, você cria uma subclasse que lida apenas com arrays de arrays, onde o T genérico foi usado desta forma T[][] . Mas o slot genérico em Array this seria T[] , como você expressa isso de uma maneira que sempre funciona?

Existem mais exemplos na questão mencionada acima, bem como de onde isso polimórfico quebra quando combinado com genéricos.

O problema com 'map' é de fato o mesmo discutido em "Polimórfico 'isto' e genérico", mas todos os outros métodos Array problemáticos poderiam funcionar corretamente simplesmente retornando 'isto'.

E os métodos Array.from e Array.of produzem um problema separado, que também é impossível de representar com a sintaxe atual do TypeScript, até onde eu sei, porque a interface ArrayConstructor teria que ser capaz de se referir ao 'this' do Array interface.

as funções estáticas podem ser resolvidas tornando Array uma classe. o problema é que precisamos encontrar uma maneira de descrever um construtor chamável (https://github.com/Microsoft/TypeScript/issues/183), já que Array também pode ser chamado como uma função. infelizmente, esta proposta travou no TC39, mas podemos fazer uma versão dela para declarações ambientais. Acho que isso deve ser rastreado separadamente.

para o resto, deve ser possível adicionar this no lugar de T[] . Eu acredito que sort já faz isso.

Esta página foi útil?
0 / 5 - 0 avaliações