如何定义数组的自定义 TypeScript 定义,其中所有元素都是数字,除了第一个
How to define a custom TypeScript definition of an array where all elements are number except first
有问题的数组是 SVG 路径段,例如 ['L', 0, 0]
我基本上是用它来定义这些数组:
// 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));
}
现在 pathCommand.toLowerCase()
调用抛出此错误:
Property 'toLowerCase' does not exist on type 'string | number'.
Property 'toLowerCase' does not exist on type 'number'.
segmentValues
抛出这个:
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'.
那么,如何定义满足此特定需求的自定义类型定义@type {WHAT} segment)
?
type A = [string, ...number[]];
有关元组类型中剩余元素的更多信息:
https://www.typescriptlang.org/docs/handbook/2/objects.html#tuple-types
以下是文档中的示例:
Tuples can also have rest elements, which have to be an array/tuple
type.
type StringNumberBooleans = [string, number, ...boolean[]];
type StringBooleansNumber = [string, ...boolean[], number];
type BooleansStringNumber = [...boolean[], string, number];
有问题的数组是 SVG 路径段,例如 ['L', 0, 0]
我基本上是用它来定义这些数组:
// 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));
}
现在 pathCommand.toLowerCase()
调用抛出此错误:
Property 'toLowerCase' does not exist on type 'string | number'.
Property 'toLowerCase' does not exist on type 'number'.
segmentValues
抛出这个:
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'.
那么,如何定义满足此特定需求的自定义类型定义@type {WHAT} segment)
?
type A = [string, ...number[]];
有关元组类型中剩余元素的更多信息: https://www.typescriptlang.org/docs/handbook/2/objects.html#tuple-types
以下是文档中的示例:
Tuples can also have rest elements, which have to be an array/tuple type.
type StringNumberBooleans = [string, number, ...boolean[]]; type StringBooleansNumber = [string, ...boolean[], number]; type BooleansStringNumber = [...boolean[], string, number];