π An array is a collection of elements of the same type (or union of types) stored in a single variable.
π TypeScript allows you to define exactly what kind of values an array can contain!
β‘ Ways to declare arrays
1οΈβ£ Type + square brackets
let numbers: number[] = [1, 2, 3, 4];
let names: string[] = ["Alice", "Bob", "Charlie"];2οΈβ£ Generic Array type
let numbers: Array<number> = [1, 2, 3, 4];
let names: Array<string> = ["Alice", "Bob", "Charlie"];β Both styles are equivalent β use whichever you prefer.
3οΈβ£ Arrays with union types
let mixed: (number | string)[] = [1, "two", 3, "four"];β‘ Array contains both numbers and strings.
4οΈβ£ Readonly arrays
let ids: readonly number[] = [1, 2, 3];
// ids.push(4); β Error: Cannot modify readonly arrayβ Example
let fruits: string[] = ["apple", "banana", "orange"];
fruits.push("mango"); // β
OK
// fruits.push(42);
// β Argument of type 'number' is not assignable to parameter of type 'string'
console.log(fruits); // ['apple', 'banana', 'orange', 'mango']π Array of objects
interface User {
id: number;
name: string;
}
let users: User[] = [
{ id: 1, name: "Alice" },
{ id: 2, name: "Bob" }
];π‘ Common array operations
let nums: number[] = [1, 2, 3, 4, 5];
nums.push(6); // Add element
let first = nums[0]; // Access element
let len = nums.length; // Get length
nums.forEach(n => console.log(n)); // Iterateβ All of these operations are type-checked!
β Best practices
Prefer explicit types for clarity (especially for function return types).
Use
readonlywhen you donβt want the array to be modified.Use tuples if position matters and types differ at each position.
<div class="infographic-ts" id="infographic-ts">
<style>
.infographic-ts {
--body-font: system-ui, -apple-system, sans-serif;
--mono-font: ui-monospace, SFMono-Regular, Consolas, "Courier New", monospace;
--ed-bg: #1e1e1e;
--ed-bar: #2a2a2a;
--ed-out: #d4d4d4;
--ed-muted: #8a8a8a;
--ed-ok: #4ec9b0;
--ed-err: #f14c4c;
--run-bg: #2e7d46;
--run-bg-hover: #35924f;
--tok-kw: #c586c0;
--tok-type: #4ec9b0;
--tok-str: #ce9178;
--tok-num: #b5cea8;
--tok-punc: #d4d4d4;
--tok-cmt: #808080;
--tok-var: #ffffff;
--tab-bg: #2a2a2a;
--tab-active: #1e1e1e;
max-width: 680px;
margin: 0 auto;
box-sizing: border-box;
background: transparent;
font-family: var(--body-font);
}
.infographic-ts * { box-sizing: border-box; }
.ts-header { font-family: 'Georgia', 'Fraunces', serif; font-weight: 700;
font-size: 1.9rem; letter-spacing: 0.01em; color: inherit; text-align: center;
margin: 0 0 1.4rem; }
.tabs { display: flex; justify-content: center; gap: 4px; margin-bottom: 1.1rem; }
.tab-btn { font-family: var(--body-font); font-size: 0.82rem; font-weight: 500;
background: #ffffff; color: #2563eb; border: 1px solid #2563eb; padding: 0.65rem 1rem;
cursor: pointer; border-radius: 8px; }
.tab-btn.active { background: #2563eb; color: #ffffff; }
.tab-btn:hover:not(.active) { background: #eef3ff; }
.tab-panel { display: none; background: var(--ed-bg); border-radius: 8px;
padding: 1.1rem; }
.tab-panel.active { display: block; }
.code-window { background: var(--ed-bg); border: 1px solid #2f2f2f; border-radius: 8px;
overflow: hidden; margin-bottom: 1rem; }
.code-window:last-child { margin-bottom: 0; }
.code-topbar { display: flex; align-items: center; justify-content: space-between;
padding: 0.5rem 0.75rem; background: var(--ed-bar); }
.code-dots { display: flex; gap: 6px; }
.code-dot { width: 9px; height: 9px; border-radius: 50%; }
.code-dot.r { background: #ff5f57; }
.code-dot.y { background: #febc2e; }
.code-dot.g { background: #28c840; }
.code-filename { font-family: var(--mono-font); font-size: 0.74rem; color: var(--ed-muted); }
.run-btn { display: inline-flex; align-items: center; gap: 0.35rem; background: var(--run-bg);
color: #fff; border: none; border-radius: 4px; padding: 0.32rem 0.7rem; font-size: 0.74rem;
font-family: var(--body-font); font-weight: 500; cursor: pointer; }
.run-btn:hover { background: var(--run-bg-hover); }
.run-btn svg { width: 10px; height: 10px; }
.code-body { padding: 0.85rem 1.1rem; font-family: var(--mono-font); font-size: 0.8rem;
line-height: 1.65; color: var(--ed-out); white-space: pre; overflow-x: auto; }
.tok-kw { color: var(--tok-kw); }
.tok-type { color: var(--tok-type); }
.tok-str { color: var(--tok-str); }
.tok-num { color: var(--tok-num); }
.tok-punc { color: var(--tok-var); }
.tok-cmt { color: var(--tok-cmt); }
.tok-var { color: var(--tok-var); }
.tok-err { color: var(--ed-err); }
.console { padding: 0 1.1rem; max-height: 0; overflow: hidden; font-family: var(--mono-font);
font-size: 0.78rem; line-height: 1.65; transition: max-height 0.35s ease, padding 0.35s ease; }
.console.show { max-height: 260px; padding: 0 1.1rem 0.85rem; }
.console-line { color: var(--ed-out); }
.console-line.ok { color: var(--ed-ok); }
.console-line.err { color: var(--ed-err); }
</style>
<div class="tabs">
<button class="tab-btn active" data-tab="t1" type="button">Ways to declare arrays</button>
<button class="tab-btn" data-tab="t2" type="button">Types of array</button>
<button class="tab-btn" data-tab="t3" type="button">Common array operations</button>
</div>
<div class="tab-panel active" id="t1">
<div class="code-window">
<div class="code-topbar">
<div class="code-dots"><span class="code-dot r"></span><span class="code-dot y"></span><span class="code-dot g"></span></div>
<span class="code-filename">brackets.ts</span>
</div>
<div class="code-body"><span class="tok-cmt">// type + square brackets</span>
<span class="tok-kw">let</span> <span class="tok-var">numbers</span><span class="tok-punc">:</span> <span class="tok-type">number</span><span class="tok-punc">[]</span> <span class="tok-punc">=</span> <span class="tok-punc">[</span><span class="tok-num">1</span><span class="tok-punc">,</span> <span class="tok-num">2</span><span class="tok-punc">,</span> <span class="tok-num">3</span><span class="tok-punc">,</span> <span class="tok-num">4</span><span class="tok-punc">];</span>
<span class="tok-kw">let</span> <span class="tok-var">names</span><span class="tok-punc">:</span> <span class="tok-type">string</span><span class="tok-punc">[]</span> <span class="tok-punc">=</span> <span class="tok-punc">[</span><span class="tok-str">"Alice"</span><span class="tok-punc">,</span> <span class="tok-str">"Bob"</span><span class="tok-punc">,</span> <span class="tok-str">"Charlie"</span><span class="tok-punc">];</span></div>
</div>
<div class="code-window">
<div class="code-topbar">
<div class="code-dots"><span class="code-dot r"></span><span class="code-dot y"></span><span class="code-dot g"></span></div>
<span class="code-filename">generic.ts</span>
</div>
<div class="code-body"><span class="tok-cmt">// generic Array<T> type — equivalent to the above</span>
<span class="tok-kw">let</span> <span class="tok-var">numbers</span><span class="tok-punc">:</span> <span class="tok-type">Array<number></span> <span class="tok-punc">=</span> <span class="tok-punc">[</span><span class="tok-num">1</span><span class="tok-punc">,</span> <span class="tok-num">2</span><span class="tok-punc">,</span> <span class="tok-num">3</span><span class="tok-punc">,</span> <span class="tok-num">4</span><span class="tok-punc">];</span>
<span class="tok-kw">let</span> <span class="tok-var">names</span><span class="tok-punc">:</span> <span class="tok-type">Array<string></span> <span class="tok-punc">=</span> <span class="tok-punc">[</span><span class="tok-str">"Alice"</span><span class="tok-punc">,</span> <span class="tok-str">"Bob"</span><span class="tok-punc">,</span> <span class="tok-str">"Charlie"</span><span class="tok-punc">];</span></div>
</div>
</div>
<div class="tab-panel" id="t2">
<div class="code-window">
<div class="code-topbar">
<div class="code-dots"><span class="code-dot r"></span><span class="code-dot y"></span><span class="code-dot g"></span></div>
<span class="code-filename">union.ts</span>
</div>
<div class="code-body"><span class="tok-cmt">// union type array — can hold either type</span>
<span class="tok-kw">let</span> <span class="tok-var">mixed</span><span class="tok-punc">:</span> <span class="tok-punc">(</span><span class="tok-type">number</span> <span class="tok-punc">|</span> <span class="tok-type">string</span><span class="tok-punc">)[]</span> <span class="tok-punc">=</span> <span class="tok-punc">[</span><span class="tok-num">1</span><span class="tok-punc">,</span> <span class="tok-str">"two"</span><span class="tok-punc">,</span> <span class="tok-num">3</span><span class="tok-punc">,</span> <span class="tok-str">"four"</span><span class="tok-punc">];</span></div>
</div>
<div class="code-window">
<div class="code-topbar">
<div class="code-dots"><span class="code-dot r"></span><span class="code-dot y"></span><span class="code-dot g"></span></div>
<span class="code-filename">readonly.ts</span>
<button class="run-btn" id="roBtn" type="button">
<svg viewBox="0 0 24 24" fill="currentColor"><polygon points="6 3 20 12 6 21 6 3"/></svg>
run
</button>
</div>
<div class="code-body"><span class="tok-cmt">// readonly array — can't be modified after creation</span>
<span class="tok-kw">let</span> <span class="tok-var">ids</span><span class="tok-punc">:</span> <span class="tok-kw">readonly</span> <span class="tok-type">number</span><span class="tok-punc">[]</span> <span class="tok-punc">=</span> <span class="tok-punc">[</span><span class="tok-num">1</span><span class="tok-punc">,</span> <span class="tok-num">2</span><span class="tok-punc">,</span> <span class="tok-num">3</span><span class="tok-punc">];</span>
<span class="tok-var">ids</span><span class="tok-punc">.</span><span class="tok-var">push</span><span class="tok-punc">(</span><span class="tok-num">4</span><span class="tok-punc">);</span></div>
<div class="console" id="roConsole"></div>
</div>
<div class="code-window">
<div class="code-topbar">
<div class="code-dots"><span class="code-dot r"></span><span class="code-dot y"></span><span class="code-dot g"></span></div>
<span class="code-filename">objects.ts</span>
</div>
<div class="code-body"><span class="tok-kw">interface</span> <span class="tok-type">User</span> <span class="tok-punc">{</span>
<span class="tok-var">id</span><span class="tok-punc">:</span> <span class="tok-type">number</span><span class="tok-punc">;</span>
<span class="tok-var">name</span><span class="tok-punc">:</span> <span class="tok-type">string</span><span class="tok-punc">;</span>
<span class="tok-punc">}</span>
<span class="tok-kw">let</span> <span class="tok-var">users</span><span class="tok-punc">:</span> <span class="tok-type">User</span><span class="tok-punc">[]</span> <span class="tok-punc">=</span> <span class="tok-punc">[</span>
<span class="tok-punc">{</span> <span class="tok-var">id</span><span class="tok-punc">:</span> <span class="tok-num">1</span><span class="tok-punc">,</span> <span class="tok-var">name</span><span class="tok-punc">:</span> <span class="tok-str">"Alice"</span> <span class="tok-punc">},</span>
<span class="tok-punc">{</span> <span class="tok-var">id</span><span class="tok-punc">:</span> <span class="tok-num">2</span><span class="tok-punc">,</span> <span class="tok-var">name</span><span class="tok-punc">:</span> <span class="tok-str">"Bob"</span> <span class="tok-punc">}</span>
<span class="tok-punc">];</span></div>
</div>
</div>
<div class="tab-panel" id="t3">
<div class="code-window">
<div class="code-topbar">
<div class="code-dots"><span class="code-dot r"></span><span class="code-dot y"></span><span class="code-dot g"></span></div>
<span class="code-filename">push-check.ts</span>
<button class="run-btn" id="pushBtn" type="button">
<svg viewBox="0 0 24 24" fill="currentColor"><polygon points="6 3 20 12 6 21 6 3"/></svg>
run
</button>
</div>
<div class="code-body"><span class="tok-kw">let</span> <span class="tok-var">fruits</span><span class="tok-punc">:</span> <span class="tok-type">string</span><span class="tok-punc">[]</span> <span class="tok-punc">=</span> <span class="tok-punc">[</span><span class="tok-str">"apple"</span><span class="tok-punc">,</span> <span class="tok-str">"banana"</span><span class="tok-punc">,</span> <span class="tok-str">"orange"</span><span class="tok-punc">];</span>
<span class="tok-var">fruits</span><span class="tok-punc">.</span><span class="tok-var">push</span><span class="tok-punc">(</span><span class="tok-str">"mango"</span><span class="tok-punc">);</span>
<span class="tok-var">fruits</span><span class="tok-punc">.</span><span class="tok-var">push</span><span class="tok-punc">(</span><span class="tok-num">42</span><span class="tok-punc">);</span>
<span class="tok-var">console</span><span class="tok-punc">.</span><span class="tok-var">log</span><span class="tok-punc">(</span><span class="tok-var">fruits</span><span class="tok-punc">);</span></div>
<div class="console" id="pushConsole"></div>
</div>
<div class="code-window">
<div class="code-topbar">
<div class="code-dots"><span class="code-dot r"></span><span class="code-dot y"></span><span class="code-dot g"></span></div>
<span class="code-filename">operations.ts</span>
<button class="run-btn" id="opsBtn" type="button">
<svg viewBox="0 0 24 24" fill="currentColor"><polygon points="6 3 20 12 6 21 6 3"/></svg>
run
</button>
</div>
<div class="code-body"><span class="tok-kw">let</span> <span class="tok-var">nums</span><span class="tok-punc">:</span> <span class="tok-type">number</span><span class="tok-punc">[]</span> <span class="tok-punc">=</span> <span class="tok-punc">[</span><span class="tok-num">1</span><span class="tok-punc">,</span> <span class="tok-num">2</span><span class="tok-punc">,</span> <span class="tok-num">3</span><span class="tok-punc">,</span> <span class="tok-num">4</span><span class="tok-punc">,</span> <span class="tok-num">5</span><span class="tok-punc">];</span>
<span class="tok-var">nums</span><span class="tok-punc">.</span><span class="tok-var">push</span><span class="tok-punc">(</span><span class="tok-num">6</span><span class="tok-punc">);</span> <span class="tok-cmt">// add to the end</span>
<span class="tok-var">nums</span><span class="tok-punc">.</span><span class="tok-var">pop</span><span class="tok-punc">();</span> <span class="tok-cmt">// remove from the end</span>
<span class="tok-kw">let</span> <span class="tok-var">first</span> <span class="tok-punc">=</span> <span class="tok-var">nums</span><span class="tok-punc">[</span><span class="tok-num">0</span><span class="tok-punc">];</span> <span class="tok-cmt">// access by index</span>
<span class="tok-kw">let</span> <span class="tok-var">len</span> <span class="tok-punc">=</span> <span class="tok-var">nums</span><span class="tok-punc">.</span><span class="tok-var">length</span><span class="tok-punc">;</span> <span class="tok-cmt">// get length</span>
<span class="tok-var">nums</span><span class="tok-punc">.</span><span class="tok-var">forEach</span><span class="tok-punc">(</span><span class="tok-var">n</span> <span class="tok-punc">=></span> <span class="tok-var">console</span><span class="tok-punc">.</span><span class="tok-var">log</span><span class="tok-punc">(</span><span class="tok-var">n</span><span class="tok-punc">));</span> <span class="tok-cmt">// iterate</span>
<span class="tok-kw">let</span> <span class="tok-var">doubled</span> <span class="tok-punc">=</span> <span class="tok-var">nums</span><span class="tok-punc">.</span><span class="tok-var">map</span><span class="tok-punc">(</span><span class="tok-var">n</span> <span class="tok-punc">=></span> <span class="tok-var">n</span> <span class="tok-punc">*</span> <span class="tok-num">2</span><span class="tok-punc">);</span> <span class="tok-cmt">// transform</span>
<span class="tok-kw">let</span> <span class="tok-var">evens</span> <span class="tok-punc">=</span> <span class="tok-var">nums</span><span class="tok-punc">.</span><span class="tok-var">filter</span><span class="tok-punc">(</span><span class="tok-var">n</span> <span class="tok-punc">=></span> <span class="tok-var">n</span> <span class="tok-punc">%</span> <span class="tok-num">2</span> <span class="tok-punc">===</span> <span class="tok-num">0</span><span class="tok-punc">);</span> <span class="tok-cmt">// filter</span>
<span class="tok-kw">let</span> <span class="tok-var">has3</span> <span class="tok-punc">=</span> <span class="tok-var">nums</span><span class="tok-punc">.</span><span class="tok-var">includes</span><span class="tok-punc">(</span><span class="tok-num">3</span><span class="tok-punc">);</span> <span class="tok-cmt">// check membership</span>
<span class="tok-kw">let</span> <span class="tok-var">at3</span> <span class="tok-punc">=</span> <span class="tok-var">nums</span><span class="tok-punc">.</span><span class="tok-var">indexOf</span><span class="tok-punc">(</span><span class="tok-num">3</span><span class="tok-punc">);</span> <span class="tok-cmt">// find index</span>
<span class="tok-kw">let</span> <span class="tok-var">slice</span> <span class="tok-punc">=</span> <span class="tok-var">nums</span><span class="tok-punc">.</span><span class="tok-var">slice</span><span class="tok-punc">(</span><span class="tok-num">1</span><span class="tok-punc">,</span> <span class="tok-num">3</span><span class="tok-punc">);</span> <span class="tok-cmt">// copy a range</span>
<span class="tok-kw">let</span> <span class="tok-var">joined</span> <span class="tok-punc">=</span> <span class="tok-var">nums</span><span class="tok-punc">.</span><span class="tok-var">join</span><span class="tok-punc">(</span><span class="tok-str">", "</span><span class="tok-punc">);</span> <span class="tok-cmt">// to string</span></div>
<div class="console" id="opsConsole"></div>
</div>
</div>
<script>
(function () {
var wrapper = document.currentScript.closest('.infographic-ts')
|| document.querySelector('.infographic-ts');
var root = wrapper;
var tabBtns = root.querySelectorAll('.tab-btn');
var panels = root.querySelectorAll('.tab-panel');
tabBtns.forEach(function (btn) {
btn.addEventListener('click', function () {
var target = btn.getAttribute('data-tab');
tabBtns.forEach(function (b) { b.classList.toggle('active', b === btn); });
panels.forEach(function (p) { p.classList.toggle('active', p.id === target); });
});
});
function line(consoleEl, cls, text) {
var el = document.createElement('div');
el.className = 'console-line ' + (cls || '');
el.textContent = text;
consoleEl.appendChild(el);
}
var roBtn = root.querySelector('#roBtn');
var roConsole = root.querySelector('#roConsole');
roBtn.addEventListener('click', function () {
roConsole.innerHTML = '';
roConsole.classList.add('show');
line(roConsole, 'err', "Error: Property 'push' does not exist on type 'readonly number[]'.");
});
var pushBtn = root.querySelector('#pushBtn');
var pushConsole = root.querySelector('#pushConsole');
pushBtn.addEventListener('click', function () {
pushConsole.innerHTML = '';
pushConsole.classList.add('show');
line(pushConsole, 'ok', "fruits.push(\"mango\") \u2192 OK");
line(pushConsole, 'err', "fruits.push(42) \u2192 Error: Argument of type 'number' is not assignable to parameter of type 'string'.");
line(pushConsole, '', "console.log(fruits) \u2192 ['apple', 'banana', 'orange', 'mango']");
});
var opsBtn = root.querySelector('#opsBtn');
var opsConsole = root.querySelector('#opsConsole');
opsBtn.addEventListener('click', function () {
opsConsole.innerHTML = '';
opsConsole.classList.add('show');
line(opsConsole, '', 'nums \u2192 [1, 2, 3, 4, 5, 6]');
line(opsConsole, '', 'first \u2192 1');
line(opsConsole, '', 'len \u2192 6');
line(opsConsole, '', 'forEach logs \u2192 1 2 3 4 5 6');
line(opsConsole, '', 'doubled \u2192 [2, 4, 6, 8, 10, 12]');
line(opsConsole, '', 'evens \u2192 [2, 4, 6]');
line(opsConsole, '', 'has3 \u2192 true');
line(opsConsole, '', 'at3 \u2192 2');
line(opsConsole, '', 'slice \u2192 [2, 3]');
line(opsConsole, 'ok', 'joined \u2192 "1, 2, 3, 4, 5, 6"');
});
})();
</script>
</div>β¨ Summary table
Array type | Example |
|---|---|
number[] | [1, 2, 3] |
Array<string> | ["a", "b", "c"] |
readonly string[] | ["a", "b"] (cannot modify) |