#javascript #typescript #matrix #typescript-typings
#javascript #typescript #матрица #typescript-типизации
Вопрос:
Я работал над попыткой создать рекурсивное определение типа для матрицы, но я не совсем понимаю, как написать его из чтения PR. Моя идея заключается в том, что определение MatrixLiteral
типа должно принимать следующие значения:
const test1D: MatrixLiteral = [0, 2, 1];
const test2D: MatrixLiteral = [
[3, 14, 2],
[6, 2, 1],
];
const test3D: MatrixLiteral = [
[
[3, 14, 2],
[6, 2, 1],
],
[
[3, 14, 2],
[6, 2, 1],
],
];
Но я просто не могу заставить какие-либо типы работать для этого. Кроме того, обратите внимание, что я хочу, чтобы number
в массивах были только типы. Спасибо за ваше время!
Еще одно замечание: ранг матрицы всегда будет больше 0. ( rank > 0
)
Комментарии:
1. Хорошо, я добрался до
type MatrixLiteral = [...(number | MatrixLiteral)[]];
но есть ли способ убедиться, что элементы всех массивов являются либо типомnumber
, либоnumber[]
?2. Вы можете упростить этот тип до
type MatrixLiteral = (number | MatrixLiteral)[]
. Это должно делать то, что вы хотите; какие значения это допускает, что, по вашему мнению, не должно?3. @DylanSp Я надеялся, что есть способ убедиться, что typescript обеспечивает соблюдение того, что во всех последних дочерних элементах данного должны быть числа
MatrixLiteral
.4. @DylanSp Также мне нужно было сделать это по-своему, потому что ранг должен быть больше 0. (Я не хочу, чтобы оно было установлено просто
1
или любым другим числом)5. Итак, вы хотите исключить пустые массивы на нижнем уровне, это то, о чем вы спрашиваете? Предоставленный тип не допускает строк / логических значений / и т.д.
Ответ №1:
Вы можете заставить массивы не быть пустыми с помощью следующего
type MatrixLiteral =
| [number, ...number[]]
| [MatrixLiteral, ...MatrixLiteral[]]
Ответ №2:
Это можно сделать с помощью простого рекурсивного типа: type MatrixLiteral = number[] | MatrixLiteral[];
.
Комментарии:
1. Это позволит делать такие вещи,
[1,[2,[3,[4,[5]]]]]
которые могут быть или не быть желательными. Я не уверен, какие ограничения OP действительно хочет применить здесь.2. @jcalz Верно; Я сделал его более строгим в редактировании, которое исключает этот пример, но по-прежнему не обеспечивает соблюдения требований к длине. Не уверен, что вы могли бы предотвратить, скажем,
[[1, 2], [3]]
в системе типов TS.