Визначення масиву з декількома типами в TypeScript


185

У мене є масив виду: [ 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
@Nadine І в такому випадку, що можна зробити?
— msanford

4
Кожен раз, коли вам зрозуміло, для якого типу це, ви можете робити твердження про тип. Тоді він буде працювати для доступу до властивостей.
— Надін

78

Якщо ви розглядаєте це як кортеж (див. Розділ 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
Примітка - обидва типи ОБОВ'ЯЗКОВО бути в масиві (також не працює для порожнього масиву). Прийнята відповідь більш універсальна і якою я особисто завжди користуюся, але це залежить від потреб.
— Druvis Cukurs

27

Мій ТС-скарб скаржився на інші рішення, тож рішення, яке працювало для мене:

item: Array<Type1 | Type2>

якщо є лише один тип, добре використовувати:

item: Type1[]

Це чудово, але скажімо, якщо ми перекидаємося на масив зараз, як ми з'ясуємо, який тип поточного масиву?
— тиліха


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.