Definiera array med flera typer i TypeScript
Jag har en array av formen: [ 1, "message" ].
Hur skulle jag definiera detta i TypeScript?
Svar #1
Definiera array med flera typer i TypeScript
Använd en unionstyp (string|number)[] demo:
const foo: (string|number)[] = [ 1, "message" ];
Jag har en array av formen: [ 1, "message" ].
Om du är säker på att det alltid bara finns två element [nummer, sträng] kan du deklarera det som en tuppel:
const foo: [number, string] = [ 1, "message" ];
Och du kan till och med ge meningsfulla namn åt tuplens medlemmar, t.ex. id och text:
const foo: [id: number, text: string] = [ 1, "message" ];
Svar #2
Om du behandlar det som en tuppel (se avsnitt 3.3.3 i språkets specifikation), då:
var t:[number, string] = [1, "message"]
eller
interface NumberStringTuple extends Array<string|number>{0:number; 1:string}
var t:NumberStringTuple = [1, "message"];
Svar #3
Min TS-lint klagade på andra lösningar, så lösningen som fungerade för mig var:
item: Array<Type1 | Type2>
om det bara finns en typ, är det okej att använda:
item: Type1[]
Svar #4
TypeScript 3.9+ uppdatering (12 maj 2020)
Nu stöder TypeScript även namngivna tupler. Detta ökar avsevärt förståelsen och underhållet av koden. Kolla den officiella TS-lekplatsen.
Så, nu istället för namnlös:
const a: [number, string] = [ 1, "message" ];
Vi kan lägga till namn:
const b: [id: number, message: string] = [ 1, "message" ];
Observera: du behöver lägga till alla namn samtidigt, du kan inte utelämna vissa namn, t.ex:
type tIncorrect = [id: number, string]; // INCORRECT, 2nd element has no name, compile-time error.
type tCorrect = [id: number, msg: string]; // CORRECT, all have a names.
Tips: om du inte är säker på antalet av de sista elementen kan du skriva det så här:
type t = [msg: string, ...indexes: number];// means first element is a message and there are unknown number of indexes.
TypeScript 4.x+ Variadiska tuplertyper
Det sista exemplet måste ändras till detta för TS 4.x:
type t = [msg: string, ...indexes: number[]];// means first element is a message and there are unknown number of indexes.
Typen number ändras till number[].
Mer information här: https://www.typescriptlang.org/docs/handbook/release-notes/typescript-4-0.html#variadic-tuple-types
Svar #5
Jag har bestämt mig för följande format för att skriva arrayer som kan ha element av flera typer.
Array<ItemType1 | ItemType2 | ItemType3>Detta fungerar bra med testning och typvakter. https://www.typescriptlang.org/docs/handbook/advanced-types.html#type-guards-and-differentiating-types
Detta format fungerar inte bra med testning eller typvakter:
(ItemType1 | ItemType2 | ItemType3)[]