Cómo definir una costumbre Manuscrito definición de una matriz donde todos los elementos son de número a excepción de la primera

0

Pregunta

Las matrices en cuestión son SVG segmentos de la ruta, por ejemplo ['L', 0, 0] Estoy básicamente de utilizar esta opción para definir estas matrices:

// doSomethingToSegment.js

/** @type {Object.<string, number>} */
const paramsCount = {
  a: 7, c: 6, h: 1, l: 2, m: 2, r: 4, q: 4, s: 4, t: 2, v: 1, z: 0,
};
  
/**
 * This definition is WRONG, FIX ME!!
 *
 * @typedef {(string|number)[]} segment
 */

/**
 * Check segment validity.
 *
 * @param {segment} seg input segment
 * @return {boolean} segment is/not valid
 */
function checkSegment(seg) {
  const [pathCommand] = seg;
  const LK = pathCommand.toLowerCase();
  const UK = pathCommand.toUpperCase();
  const segmentValues = seg.slice(1);
  const expectedAmount = paramsCount[LK];

  return checkPathCommand(UK) && checkPathValues(segmentValues, expectedAmount);
}

/**
 * @param {string} ch input character
 * @returns {boolean} true when `ch` is path command
 */
function checkPathCommand(ch) {
  return ('ACHLMRQSTVZ').includes(ch);
}

/**
 * @param {Number[]} values input values
 * @param {Number} expected amount
 * @return {boolean} segment has/not the right amount of valid numbers
 */
function checkPathValues(values, expected) {
  return values.length === expected && values.every(x => !Number.isNaN(x));
}

Ahora el pathCommand.toLowerCase() llame lanza este error:

Property 'toLowerCase' does not exist on type 'string | number'.
  Property 'toLowerCase' does not exist on type 'number'.

Y el segmentValues tira esto:

Argument of type '(string | number)[]' is not assignable to parameter of type 'number[]'.
  Type 'string | number' is not assignable to type 'number'.
    Type 'string' is not assignable to type 'number'.

Entonces, ¿cómo definir un tipo de definición @type {WHAT} segment) que satisface esta necesidad específica?

ecmascript-6 javascript typescript
2021-11-22 15:33:56
1

Mejor respuesta

2
type A = [string, ...number[]];

Más info sobre el resto de los elementos en tipos de tupla: https://www.typescriptlang.org/docs/handbook/2/objects.html#tuple-types

Aquí están los ejemplos de la documentación:

Tuplas también puede tener resto de los elementos, que tiene que ser un array/tupla tipo.

type StringNumberBooleans = [string, number, ...boolean[]];
type StringBooleansNumber = [string, ...boolean[], number];
type BooleansStringNumber = [...boolean[], string, number];
2021-11-22 15:49:59

Pregunta rápida: ¿puede este ser adoptado para la Tupla de objetos? Algo como {type: string, ...{string, number}[]}, Yo estaba probando de todo no consigo que funcione.
thednp

Lo siento, yo no entendía muy bien. Tal vez usted podría publicar un nuevo Desbordamiento de Pila pregunta con un poco más de detalle?
Anastasia

Exactamente lo mismo pero para los objetos, en lugar de [string, ...number[]] es posible tener algo como {myString: string, ...{string, number}[]].
thednp

En otros idiomas

Esta página está en otros idiomas

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Slovenský
..................................................................................................................