İlk hariç tüm öğelerin sayı olduğu bir dizinin özel bir TypeScript tanımı nasıl tanımlanır

0

Soru

Söz konusu diziler, örneğin SVG yolu bölümleridir ['L', 0, 0] Temel olarak bu dizileri tanımlamak için bunu kullanıyorum:

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

Şimdi pathCommand.toLowerCase() çağrı bu hatayı atar:

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

Ve... segmentValues bunu atar.:

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

Peki, özel bir tür tanımı nasıl tanımlanır @type {WHAT} segment) bu özel ihtiyacı karşılar mı?

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

En iyi cevabı

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

Tuple türlerinde rest öğeleri hakkında daha fazla bilgi: https://www.typescriptlang.org/docs/handbook/2/objects.html#tuple-types

İşte dokümanlardan örnekler:

Tuples ayrıca bir dizi / tuple olması gereken dinlenme elemanlarına da sahip olabilir tip.

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

Hızlı soru: Bu, Tuple nesneleri için kabul edilebilir mi? Aşağı yukarı {type: string, ...{string, number}[]} Her şeyin işe yaramadığını test ediyordum.
thednp

Üzgünüm, tam olarak anlamadım. Belki biraz daha ayrıntılı olarak yeni bir Yığın Taşması sorusu gönderebilir misiniz?
Anastasia

Tam olarak aynı şey ama nesneler için değil [string, ...number[]] böyle bir şeye sahip olmak mümkün mü {myString: string, ...{string, number}[]].
thednp

Diğer dillerde

Bu sayfa diğer dillerde

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