Compatibilidade do keyof e Indexer no TypeScript?
Eu tenho uma assinatura de método que espera um segundo argumento de keyof Array<...>. Como a interface Array define um indexador [n: number]: T;, eu esperaria que houvesse alguma maneira de se referir a algum índice no método.
Mas eu não consigo encontrar como. Eu tentei o seguinte:
MyMethod(myArray, 0); // Argument of type '0' is not assignable to parameter of type ...
MyMethod(myArray, [0]); // Argument of type 'number[]' is not assignable to parameter of type ...
MyMethod(myArray, '0'); // Argument of type '"0"' is not assignable to parameter of type ...
MyMethod(myArray, '[0]'); // Argument of type '"[0]"' is not assignable to parameter of type ...
E nenhum está funcionando.
Resposta #1
Você sempre poderia tentar:
function myFun<T>(arr: Array<T>, index: number) {
return arr[index];
}
keyof Array<...> se refere a todos os nomes de propriedades de arrays, como length, toString, push, pop, etc. Índices numéricos não fazem parte da interface Array da mesma maneira porque eles são um tipo de consulta:
interface Array<T> {
length: number;
toString(): string;
... etc ...
[n: number]: T;
}
Considere uma interface mais simples:
interface Arr<T> {
[n: number]: T;
}
const variable: keyof Arr<number>; // variable is of type "never"
Na verdade, isso é uma limitação da linguagem. Veja também este problema no GitHub:
Não podemos listar todas essas literais de string numéricas (efetivamente).
keyof Container<T>serianumber | numericStringcomnumericStringcomo tipo de todas as literais de string numéricas com uma literal numérica correspondente.number | stringnão seria correto porque nem todastringé umanumericString. Além disso, nem toda sequência de caracteres numéricos é umnumericStringjá que o número tem um valor máximo e mínimo.
