Как преобразовать утверждение типа Dynami c в Stati c One? - PullRequest
0 голосов
/ 15 апреля 2020

Есть ли способ динамически генерировать константное утверждение в ?

Я знаю, что вы можете создать readonlyArray утверждение на основе статически типизированного массива, например.

 const staticTyped = [1, 2, 3] as const // readonly [1, 2, 3]
 type TypeStatic = typeof staticTyped[number] // 1 | 2 | 3

Теперь все работает как положено и элегантно. Тем не менее, мне нужно создать большой массив только для чтения, который генерируется динамически.

const generateNumRange = (from: number, to: number): number[] => {
  const arr = []
  for (let i = from; i <= to; i++) {
     arr.push(i)
  }
  return arr
}

const dynamicTyped = [...generateNumRange(0, 255)] as const // readonly number[]
type TypeDynamic = typeof dynamicTyped[number] // number (oof)

Теперь я понимаю, в чем проблема, однако я не могу придумать способ, который позволил бы мне верните dyanmicTyped как [0, 1, 2, ..., 255] вместо number[].

Есть ли способ сделать это / возможно даже более элегантное решение проблемы в целом?

1 Ответ

2 голосов
/ 15 апреля 2020

Напомним, что система типов не существует во время выполнения. https://github.com/microsoft/TypeScript/issues/15480 Типы диапазонов запрашиваются в течение длительного времени.

Я не понимаю, почему тип number[] недопустим, однако, если вам абсолютно нужно Выводя тип, вы должны будете точно сказать TS, что делать.

(я видел, как авторы библиотек делали это раньше, так что, возможно, это не так глупо? Но, надеюсь, это показывает, что вы достигли одного из ограничения системы типов.)

type T1_2 = 0 | 1 | 2;
type T1_3 = T1_2 | 3;
type T1_4 = T1_3 | 4;

function generateNumRange(from: 0, to: 2): T1_2[];
function generateNumRange(from: 0, to: 3): T1_3[];
function generateNumRange(from: 0, to: 4): T1_4[];
function generateNumRange<T>(from: number, to: number): T[] {
  const arr = []
  for (let i = from; i <= to; i++) {
    arr.push(i)
  }
  return arr
}

const dynamicTyped = [...generateNumRange(0, 3)]
type TypeDynamic = typeof dynamicTyped[number] // 0 | 1 | 2 | 3

const dynamicTyped4 = [...generateNumRange(0, 4)]
type TypeDynamic4 = typeof dynamicTyped4[number] // 0 | 1 | 2 | 3 | 4

Надеюсь, вы можете увидеть, что вы можете сгенерировать весь этот код в простой форме для l oop, вплоть до любого конечного числа, которое вы хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...