То, чего я хочу достичь, можно сделать, как показано ниже:
// 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 принимает только один аргумент типа и нет явного способа определить длину, есть ли способ добиться этого с помощью интерфейса, или мне действительно придется определять свой тип, используя первый подход?
Спасибо 🤓
«Мне не нравится использовать такое объявление типа». Подождите, а почему бы и нет? Вот как вы должны это сделать. Если бы я спросил: «Как я могу открыть банку вилкой? Я не люблю использовать консервные ножи», что бы вы ответили?
Это потому, что я пришел с Java, и использование интерфейса Array для объявления массива вместо прямого использования [ ... ] кажется мне более правильным, idk, это просто мое мнение
Конечно, вы можете высказать свое мнение, но типы кортежей являются частью TypeScript, а не Java, и это одна из тех ситуаций, когда нет особого смысла использовать Java в качестве руководства по TypeScript.
Является ли обозначение основным вопросом здесь? Если вас просто беспокоит нотация, вы можете использовать псевдоним типа, чтобы скрыть скобки от разработчиков Java, например, это может быть. Хотели бы вы, чтобы это было записано как ответ?



Что ж, это возможно, но нужно написать небольшой шаблон, чтобы добиться того же, что и в первом подходе, о котором я упоминал:
Потребуется создать интерфейс, расширяющий массив
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, я заметил, что не стоит использовать этот подход, потому что шаблон может выйти из-под контроля, поэтому я рекомендую вместо этого использовать определение кортежа. 😅
Они не совсем «приводят к одному и тому же»; есть масса ситуаций, когда вы столкнетесь с разницей, и некоторые из этих отличий довольно неприятны. Правильнее всего использовать типы кортежей, если только вы не столкнетесь с ситуациями, когда они не работают.
Отвечает ли это на ваш вопрос? Как объявить массив фиксированной длины в TypeScript