Определение массива с несколькими типами в TypeScript


187

У меня есть массив вида: [ 1, "message" ] .

Как бы я определить это в TypeScript?


Подобный вопрос, но без ответа, но на этот раз с использованием наследования классов с неизвестным количеством элементов и расширением одного и того же класса: stackoverflow.com/questions/50322488/…
Cancerbero

Ответы:


313

Определение массива с несколькими типами в TypeScript

Используйте (string|number)[]демо типа объединения :

const foo: (string|number)[] = [ 1, "message" ];

У меня есть массив вида: [1, «сообщение»].

Если вы уверены, что всегда есть только два элемента, [number, string]вы можете объявить его как кортеж:

const foo: [number, string] = [ 1, "message" ];

2
Просто обратите внимание, что для этого потребуется TS v1.4 +
Brocco

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

1
@ Надин И в таком случае, что можно сделать?
Мсэнфорд

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

79

Если вы рассматриваете его как кортеж (см. Раздел 3.3.3 спецификации языка ), то:

var t:[number, string] = [1, "message"]

или

interface NumberStringTuple extends Array<string|number>{0:number; 1:string}
var t:NumberStringTuple = [1, "message"];

10
СОВЕТ: Я бы предпочелtype NumberStringTuple = [number, string]
Басарат

1
Спасибо! Я полностью искал это:const W3COLORS: [[string, string, number, number]] = [ ["aliceblue", "#f0f8ff", 240, 248, 255], ... ];
CoderPi

1
Примечание - оба типа ДОЛЖНЫ быть в массиве (не работает и для пустого массива). Принятый ответ более универсален и которым я лично всегда пользуюсь, но это зависит от потребностей.
Друвис Цукурс

27

Мой TS TS жаловался на другие решения, поэтому решение, которое работало для меня, было:

item: Array<Type1 | Type2>

если есть только один тип, хорошо использовать:

item: Type1[]

Это замечательно, но, скажем, если мы сейчас перебираем массив, как мы выясним, к какому типу относится текущий массив?
thouliha


12

Я остановился на следующем формате для ввода массивов, которые могут иметь элементы нескольких типов.

Array<ItemType1 | ItemType2 | ItemType3>

Это хорошо работает с тестированием и защитой типа. https://www.typescriptlang.org/docs/handbook/advanced-types.html#type-guards-and-differentiating-types

Этот формат плохо работает с тестированием или защитой типа:

(ItemType1 | ItemType2 | ItemType3)[]


4

Я использую эту версию:

exampleArr: Array<{ id: number, msg: string}> = [
   { id: 1, msg: 'message'},
   { id: 2, msg: 'message2'}
 ]

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.