Как определить массив массивов типа c в TypeScript? - PullRequest
0 голосов
/ 14 апреля 2020

Я изучаю расширенные типы в TypeScript, и мне было интересно, возможно ли каким-то образом определить этот тип типа.

Идея состоит в том, чтобы иметь класс A, имеющий конструктор, который должен принимать массив ограниченные массивы или массивы объектов или любой другой подходящий тип данных, чтобы все внутренние структуры данных могли принимать только два элемента, чтобы первый мог быть определен при вызове конструктора, а другой - фиксированным? Если тип не определен, он должен принимать все примитивные типы, но второй все равно будет фиксированным.

Примерно так, например:

interface Inner<T> {
  first: T,
  second: number
}
class A<T> {
  constructor(arrayofxs: Array<Inner<T>>) { 
    // Do something
  }

}

Затем использовать его нравится. если тип не установлен конкретно, первый аргумент будет принимать все примитивы или объект

new A([['asd', 1], [123, 2], [{a: 1, b:123}, 3], ...])

, а затем, когда он установлен, он будет принимать только тип набора в качестве первого:

new A<string>([['asd', 1], ['123', 2], ['qwerty', 3], ...])

Внутренний массив не обязательно должен быть определенным массивом.

Если я определю внутреннюю структуру как

type Inner = Array<T|number>

Это не установит порядок аргументов и не ограничит количество аргументы. Вот почему я думаю, что массив не подходит как внутренняя структура, но я, вероятно, должен использовать объект.

Если я определю внутренний тип следующим образом:

type Inner<T> = [T, number]

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

new A([['asd', 1], [123, 2], ... ])

Во втором внутреннем массиве [123, 2] будет отображаться ошибка

Тип 'номер' не может быть назначен введите 'string'.ts (2322)

Я мог бы использовать это так

new A<any>([['asd', 1], [123, 2], ...])

Но тогда использование any - это действительно плохая практика, и я не хочу использовать его.

Как я мог добиться такого набора текста?

...