Pesquisa de site

Tipagens JSDoc para TypeScript para acumulador de reducer em JavaScript


Estou tentando digitar o acumulador em um reducer do JavaScript usando JSDocs, mas não consigo descobrir como fazer isso.

Eu tentei digitar isso inline na inicialização, mas não funcionou. Alguma dica ou ideia? Aqui está o código de exemplo. Está reclamando sobre o parâmetro passado para arr.push():

/**
* @type {Array<String>}
*/
const arr = ['one', 'two', 'three'];

/**
 * @type {Array<Array>}
 */
const result = arr.reduce((acc, item) => {
   if(item.length % 3 === 0) {
     // [ts] Argument of type '(string | number)[]' is not assignable to
     // parameter of type 'never'.
     acc.push([item, item.length]);
   }
   return acc;
}, []);

Aqui está o repositório do GitHub que possui o arquivo tsconfig.json na raiz do projeto para as configurações do tsc: https://github.com/guyellis/typescript-as-a-linter

E aqui está o arquivo nesse repositório do qual peguei o código acima: https://github.com/guyellis/typescript-as-a-linter/blob/master/lib/reducer.js

Resposta #1

O array vazio que você está passando como estado inicial recebe o tipo never[]. Veja este tópico para mais informações. Para evitar isso, você pode colocá-lo em uma constante e dar um tipo à constante:

/**
* @type {Array<String>}
*/
const arr = ['one', 'two', 'three'];

/** @type {Array<[string, number]>} */
const init = [];

/**
 * @type {Array<[string, number]>}
 */
const result = arr.reduce((acc, item) => {
   acc.push([item, item.length]);
   return acc;
}, init);

Resposta #2

Você também pode usar tipos inline, mas há um requisito rígido de que você coloque parênteses ao redor do valor inicial. Esta é uma sintaxe de "cast" para JSDoc:

https://www.typescriptlang.org/docs/handbook/jsdoc-supported-types.html#casts

const result = arr.reduce((acc, item) => {
   acc.push([item, item.length]);
   return acc;
}, /** @type {Array<[string, number]>} */ ([]));
// Note the parenthesis are required      ^^^^

Artigos relacionados