TypeScriptで複数の型を持つ配列を定義する


185

次の形式の配列があります[ 1, "message" ]。

TypeScriptでこれをどのように定義しますか?


同様の無応答してこれに疑問、が、今回のアイテムの数が不明で、クラスの継承を使用し、すべて同じクラスを拡張する:stackoverflow.com/questions/50322488/...
— cancerbero

回答:


313

TypeScriptで複数の型を持つ配列を定義する

ユニオンタイプの(string|number)[]デモを使用します。

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

次の形式の配列があります:[1、 "message"]。

要素が常に2つしかないことが確実な場合は[number, string]、それをタプルとして宣言できます。

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

2
これにはTS v1.4以降が必要になることに注意してください
— Brocco

6
...そして、1つのタイプでのみ利用可能なプロパティにアクセスする場合、異なるプロパティを持つ複雑なタイプでは機能しません。
— ナディーン

1
@ナディーンそしてその場合、何ができるでしょうか?
— msanford '20

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]
— バサラト2015

1
ありがとう!私はこれを完全に探していました:const W3COLORS: [[string, string, number, number]] = [ ["aliceblue", "#f0f8ff", 240, 248, 255], ... ];
— CoderPi

1
注-両方のタイプが配列内になければなりません(空の配列に対しても機能しません)。受け入れられた答えはより用途が広く、私が個人的にいつも使用していますが、ニーズによって異なります。
— Druvis Cukurs 2017

27

私のTSリントは他のソリューションについて不満を言っていたので、私のために働いていたソリューションは次のとおりでした:

item: Array<Type1 | Type2>

タイプが1つしかない場合は、使用しても問題ありません。

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'}
 ]

これは他の提案と少し似ていますが、覚えやすく簡単です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.