Как определить длину массива и типы элементов с помощью интерфейса Array в TypeScript

То, чего я хочу достичь, можно сделать, как показано ниже:

// Will define a type that is an array with TWO elements where the first will be a string
// and the second a number
type SomeArrayType = [string, number];

Мне не нравилось использовать такое объявление типа для массивов, и мне нравится использовать для этого интерфейс Array, например:

// It will define a type that is an array of string with any number of elements in it
type AnotherArrayType = Array<string>;

Но поскольку интерфейс Array принимает только один аргумент типа и нет явного способа определить длину, есть ли способ добиться этого с помощью интерфейса, или мне действительно придется определять свой тип, используя первый подход?

Спасибо 🤓

Отвечает ли это на ваш вопрос? Как объявить массив фиксированной длины в TypeScript

kind user 01.11.2022 17:56

«Мне не нравится использовать такое объявление типа». Подождите, а почему бы и нет? Вот как вы должны это сделать. Если бы я спросил: «Как я могу открыть банку вилкой? Я не люблю использовать консервные ножи», что бы вы ответили?

jcalz 01.11.2022 18:09

Это потому, что я пришел с Java, и использование интерфейса Array для объявления массива вместо прямого использования [ ... ] кажется мне более правильным, idk, это просто мое мнение

Rafael Furtado 01.11.2022 18:25

Конечно, вы можете высказать свое мнение, но типы кортежей являются частью TypeScript, а не Java, и это одна из тех ситуаций, когда нет особого смысла использовать Java в качестве руководства по TypeScript.

jcalz 01.11.2022 19:22

Является ли обозначение основным вопросом здесь? Если вас просто беспокоит нотация, вы можете использовать псевдоним типа, чтобы скрыть скобки от разработчиков Java, например, это может быть. Хотели бы вы, чтобы это было записано как ответ?

jcalz 01.11.2022 19:28
Структурированный массив Numpy
Структурированный массив Numpy
Однако в реальных проектах я чаще всего имею дело со списками, состоящими из нескольких типов данных. Как мы можем использовать массивы numpy, чтобы...
T - 1Bits: Генерация последовательного массива
T - 1Bits: Генерация последовательного массива
По мере того, как мы пишем все больше кода, мы привыкаем к определенным способам действий. То тут, то там мы находим код, который заставляет нас...
Что такое деструктуризация массива в JavaScript?
Что такое деструктуризация массива в JavaScript?
Деструктуризация позволяет распаковывать значения из массивов и добавлять их в отдельные переменные.
0
5
50
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

Потребуется создать интерфейс, расширяющий массив

interface DefinedArray extends Array<string | number> {
    length: 2;

    0: string;
    1: number;

}

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

const myArray: DefinedArray = ['abc', 123];  // Correct
const anotherArray: DefinedArray = [123, 'abc'];  // Error
const moreArray: DefinedArray = ['abc', 123, 'abc123'];  // Error

Объявление его с помощью

type SomeArrayType = [string, number];

или

interface DefinedArray extends Array<string | number> {
    length: 2;

    0: string;
    1: number;

}

Приведет к одному и тому же, и оба они показаны в официальных документах: https://www.typescriptlang.org/docs/handbook/2/objects.html#tuple-types

Итак, я думаю, вам решать, какой из них вы будете использовать в своем коде 😃

ОБНОВИТЬ

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

Они не совсем «приводят к одному и тому же»; есть масса ситуаций, когда вы столкнетесь с разницей, и некоторые из этих отличий довольно неприятны. Правильнее всего использовать типы кортежей, если только вы не столкнетесь с ситуациями, когда они не работают.

jcalz 01.11.2022 19:13

Другие вопросы по теме

UseQueryWithStore работает, а useGetList — нет
Как вернуть пустой массив при возникновении httperror в Angular
Не удается найти файл определения типа для «yup». Файл находится в программе, потому что: Точка входа для библиотеки неявных типов 'yup'
Как отправить полезную нагрузку multipart/form-data с библиотекой TypeScript Obsidian?
Прото-файлы машинописного текста не генерируются
Typescript — элемент неявно имеет тип «любой», поскольку выражение типа «любой» нельзя использовать для индексации типа «тип EnumUrl». ts(7053)
Файлы Ts и tsx не анализируются Sonarqube с помощью действий Github для анализа основной ветки
Можно ли создать перечисление из объекта или создать перечисление динамически с помощью forEach в машинописном тексте?
При использовании вложенного назначения деструктурирования и значения по умолчанию машинописный текст вызывал ошибки
Как получить значение поля «вход» внутри функции EventListener из DOM в Angular