Ako definovať vlastné Strojom definícia poľa, kde sú všetky prvky sú čísla s výnimkou prvej

0

Otázka

Na polia v otázke sú SVG cesta segmenty, napríklad ['L', 0, 0] Ja som v podstate pomocou tejto definovať tieto polia:

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

Teraz pathCommand.toLowerCase() hovor hádže túto chybu:

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

A segmentValues hodí tento:

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

Tak, ako definovať vlastné definícia typu @type {WHAT} segment) ktorý spĺňa túto špecifickú potrebu?

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

Najlepšiu odpoveď

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

Viac info o zvyšok prvkov v n-tice typy: https://www.typescriptlang.org/docs/handbook/2/objects.html#tuple-types

Tu sú príklady z dokumentov:

Tice môžu mať aj zvyšok prvkov, ktoré musia byť pole/n-tice typ.

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

Rýchle otázka: dá sa to dostať prijaté na n-tice objektov? Niečo ako {type: string, ...{string, number}[]}Ja som bol testovanie všetko, čo sa nedostali do práce.
thednp

Prepáč, ja neviem celkom pochopiť. Možno by ste mohli uverejniť novú Pretečenie Zásobníka otázku trochu viac podrobností?
Anastasia

Presne tú istú vec, ale pre objekty, namiesto [string, ...number[]] je možné mať niečo ako {myString: string, ...{string, number}[]].
thednp

V iných jazykoch

Táto stránka je v iných jazykoch

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