Cum de a defini un custom Script definirea unei matrice în cazul în care toate elementele sunt în număr, în afară de prima

0

Problema

Tablouri în cauză sunt SVG segmentele de cale, de exemplu ['L', 0, 0] Practic, eu sunt, folosind acest lucru pentru a defini aceste tablouri:

// 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));
}

Acum pathCommand.toLowerCase() apel aruncă această eroare:

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

Și segmentValues aruncă o pe asta:

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'.

Deci, cum de a defini un tip personalizat definiție @type {WHAT} segment) care satisface această nevoie specifică?

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

Cel mai bun răspuns

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

Mai multe informații despre elementele de odihnă în tuplu tipuri: https://www.typescriptlang.org/docs/handbook/2/objects.html#tuple-types

Aici sunt exemple de documente:

Tupluri poate avea, de asemenea, restul de elemente, care trebuie să fie o matrice/tuplu tip.

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

Întrebare: poate fi adoptat pentru Tuplu de obiecte? Ceva de genul {type: string, ...{string, number}[]}Am testat tot ce n-am face să funcționeze.
thednp

Ne pare rau, nu inteleg. Poate ai putea posta un nou Stack Overflow întrebare cu un pic mai multe detalii?
Anastasia

Exact același lucru dar pentru obiecte, în loc de [string, ...number[]] este posibil să aveți ceva de genul {myString: string, ...{string, number}[]].
thednp

În alte limbi

Această pagină este în alte limbi

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