Определение рекурсивного типа для матрицы

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