Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

177
Views
Convierta el operador de propagación de funciones javascript t typescript

No puedo convertir ese fragmento de código de Javascript a Typescript.

El problema es convertir el operador ...spread.

 function calculateCombinations(first, next, ...rest) { if (rest.length) { next = calculateCombinations(next, ...rest); } return first.flatMap(a => next.map(b => [a, b].flat())); } a1 = ['A', 'B'] a2 = ['+', '-'] a3 = ['1', '2'] a4 = ['X', 'Y', 'Z'] // Show possibile combinations calculateCombinations(a1, a2, a3, a4); // give me an array of 24 combinations

Intento de conversión a TS:

 function calculateCombinationsTS(first: any[], next: any[], ...rest: any[]) { if (rest.length) { next = calculateCombinationsTS(next, ...rest); } return first.flatMap(a => next.map(b => [a, b].flat())); }

TS2556: un argumento de propagación debe tener un tipo de tupla o pasarse a un parámetro de descanso.

si cambio

 next = calculateCombinationsTS(next, ...rest);

a

 next = calculateCombinationsTS(next, rest);

la función me da un resultado incorrecto, porque rest se pasa como matriz de matriz en lugar de una lista de argumentos

Ejemplo de salida:

 nCombo = (a1 * a2 * a3 * a4) = 24 possibilities [ [ 'A', '+', '1', 'X' ], [ 'A', '+', '1', 'Y' ], [ 'A', '+', '1', 'Z' ], [ 'A', '+', '2', 'X' ], [ 'A', '+', '2', 'Y' ], [ 'A', '+', '2', 'Z' ], [ 'A', '-', '1', 'X' ], [ 'A', '-', '1', 'Y' ], [ 'A', '-', '1', 'Z' ], [ 'A', '-', '2', 'X' ], [ 'A', '-', '2', 'Y' ], [ 'A', '-', '2', 'Z' ], [ 'B', '+', '1', 'X' ], [ 'B', '+', '1', 'Y' ], [ 'B', '+', '1', 'Z' ], [ 'B', '+', '2', 'X' ], [ 'B', '+', '2', 'Y' ], [ 'B', '+', '2', 'Z' ], [ 'B', '-', '1', 'X' ], [ 'B', '-', '1', 'Y' ], [ 'B', '-', '1', 'Z' ], [ 'B', '-', '2', 'X' ], [ 'B', '-', '2', 'Y' ], [ 'B', '-', '2', 'Z' ] ]
about 4 years ago · Juan Pablo Isaza
3 answers
Answer question

0

Hay dos problemas:

  1. Si desea pasar una serie de argumentos de matriz para su parámetro de descanso, su parámetro de descanso debe ser una matriz de matrices, no solo una matriz. Entonces: ...rest: any[][] . TypeScript no se queja de eso porque puede usar una matriz para any , pero es un reflejo más preciso de lo que está haciendo.

  2. TypeScript no puede decir que la llamada calculateCombinationsTS(next, ...more); pasará un argumento para next a la función, aunque tenga una verificación en rest.length y sepa que lo hará. Debe llamar a la función con dos argumentos discretos, seguidos (opcionalmente) de distribuir una matriz. Puede solucionarlo tomando el primer elemento del parámetro rest y pasándolo explícitamente:

     if (rest.length) { const [first, ...more] = rest; next = calculateCombinationsTS(next, first, ...more); }

    En teoría, eso podría agregar gastos generales. En la práctica, sospecho que los gastos generales estarán lo suficientemente optimizados como para no ser un problema.

    O, dado que sabe que la llamada es correcta (porque sabe que rest tiene al menos un elemento), podría silenciar el error con un @ts-ignore , pero trato de evitarlos donde puedo.

Función completa que soluciona ambos problemas:

 function calculateCombinationsTS(first: any[], next: any[], ...rest: any[][]) { // −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−^^ if (rest.length) { const [first, ...more] = rest; // *** next = calculateCombinationsTS(next, first, ...more); // *** } return first.flatMap((a) => next.map((b) => [a, b].flat())); }

Ejemplo de área de juegos ejecutable que genera las 72 combinaciones de su ejemplo

about 4 years ago · Juan Pablo Isaza Report

0

Prueba esto

 next = calculateCombinationsTS(next, rest[0], ...rest.slice(1));

Typescript será más feliz si llama explícitamente a la función con la misma firma (primero, siguiente, ... extendido).

about 4 years ago · Juan Pablo Isaza Report

0

El problema es cómo llamas a la función, eso no es un problema de TypeScript.

calculateCombinations quiere 2 argumentos requeridos, luego algunos otros, pero está enviando solo un argumento requerido cuando lo llama nuevamente de forma recursiva.

Cuando dices calculateCombinations(next, ...rest) TypeScript piensa a next: any[] debería ser un operador de propagación

about 4 years ago · Juan Pablo Isaza Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!