LearningTS Chapter 6 - YDP-SPLOUNGE-CLUB/typescript-study GitHub Wiki

06. λ°°μ—΄

μžλ°”μŠ€ν¬λ¦½νŠΈ 배열은 맀우 μœ μ—°ν•˜κ³  λ‚΄λΆ€μ˜ λͺ¨λ“  νƒ€μž…μ˜ 값을 ν˜Όν•©ν•΄μ„œ 자μž₯ν•  수 μžˆλ‹€.

const element = [true, null, undefined, 22];

element.push("even", ["more"]);

κ·ΈλŸ¬λ‚˜ λŒ€λΆ€λΆ„μ˜ κ°œλ³„ μžλ°”μŠ€ν¬λ¦½νŠΈ 배열은 ν•˜λ‚˜μ˜ νŠΉμ • νƒ€μž…μ˜ κ°’λ§Œ κ°€μ§„λ‹€.

λ‹€λ₯Έ νƒ€μž…μ˜ 값을 μΆ”κ°€ν•˜κ²Œ 되면 배열을 읽을 λ•Œ ν˜Όλž€μ„ 쀄 수 있으며 ν”„λ‘œκ·Έλž¨μ— λ¬Έμ œκ°€ 될 λ§Œν•œ 였λ₯˜κ°€ λ°œμƒν•  μˆ˜λ„ μžˆλ‹€.

6.1 λ°°μ—΄ νƒ€μž…

λ‹€λ₯Έ λ³€μˆ˜ μ„ μ–Έκ³Ό λ§ˆμ°¬κ°€μ§€λ‘œ 배열을 μ €μž₯ν•˜κΈ° μœ„ν•œ λ³€μˆ˜λŠ” μ΄ˆκΉƒκ°’μ΄ ν•„μš”ν•˜μ§€ μ•Šλ‹€. λ³€μˆ˜λŠ” undefined 둜 μ‹œμž‘ν•΄μ„œ λ‚˜μ€‘μ— λ°°μ—΄ 값을 받을 수 μžˆλ‹€.

νƒ€μž…μŠ€ν¬λ¦½νŠΈλŠ” λ³€μˆ˜μ— νƒ€μž… μ• λ„ˆν…Œμ΄μ…˜μ„ μ œκ³΅ν•΄ 배열이 포함해야 ν•˜λŠ” κ°’μ˜ νƒ€μž…μ„ μ•Œλ €μ£Όλ €κ³  ν•œλ‹€.

6.1.1 λ°°μ—΄κ³Ό ν•¨μˆ˜ νƒ€μž…

λ°°μ—΄ νƒ€μž…μ€ ν•¨μˆ˜ νƒ€μž…μ— 무엇이 μžˆλŠ”μ§€λ₯Ό κ΅¬λ³„ν•˜λŠ” κ΄„ν˜Έκ°€ ν•„μš”ν•œ ꡬ문 μ»¨ν…Œμ΄λ„ˆμ˜ μ˜ˆμ΄λ‹€.

κ΄„ν˜ΈλŠ” μ• λ„ˆν…Œμ΄μ…˜μ˜ μ–΄λŠ 뢀뢄이 ν•¨μˆ˜ λ°˜ν™˜ 뢀뢄이고 μ–΄λŠ 뢀뢄이 λ°°μ—΄ νƒ€μž… λ¬ΆμŒμΈμ§€λ₯Ό λ‚˜νƒ€λ‚΄κΈ° μœ„ν•΄ μ‚¬μš©ν•œλ‹€.

// string 배열을 λ°˜ν™˜ν•˜λŠ” ν•¨μˆ˜
let creatrStrings: () => string[];

// 각각의 string을 λ°˜ν™˜ν•˜λŠ” ν•¨μˆ˜ λ°°μ—΄
let createCreators: (() => string)[];

6.1.2 μœ λ‹ˆμ–Έ νƒ€μž… λ°°μ—΄

λ°°μ—΄μ˜ 각 μš”μ†Œκ°€ μ—¬λŸ¬ 선택 νƒ€μž… 쀑 ν•˜λ‚˜μΌ 수 μžˆμŒμ„ λ‚˜νƒ€λ‚΄λ €λ©΄ μœ λ‹ˆμ–Έ νƒ€μž…μ„ μ‚¬μš©ν•œλ‹€.

μœ λ‹ˆμ–Έ νƒ€μž…μœΌλ‘œ λ°°μ—΄ νƒ€μž…μ„ μ‚¬μš©ν•  λ•Œ μ• λ„ˆν…Œμ΄μ…˜μ˜ μ–΄λŠ 뢀뢄이 λ°°μ—΄μ˜ μ½˜ν…μΈ μ΄κ³  μ–΄λŠ 뢀뢄이 μœ λ‹ˆμ–Έ νƒ€μž… λ¬ΆμŒμΈμ§€λ₯Ό λ‚˜νƒ€λ‚΄κΈ° μœ„ν•΄ κ΄„ν˜Έλ₯Ό μ‚¬μš©ν•΄μ•Ό ν•  μˆ˜λ„ μžˆλ‹€.

// νƒ€μž…μ€ string λ˜λŠ” number 의 λ°°μ—΄
let stringOrArrayOfNumber: string | number[];

// νƒ€μž…μ€ 각각 number λ˜λŠ” string μš”μ†Œμ™€ λ°°μ—΄
let arrayOfStringOrNumbes: (string | number)[]

6.3 μŠ€ν”„λ ˆλ“œμ™€ λ‚˜λ¨Έμ§€ λ§€κ°œλ³€μˆ˜

6.3.1 μŠ€ν”„λ ˆλ“œ

... μŠ€ν”„λ ˆλ“œ μ—°μ‚°μžλ₯Ό μ‚¬μš©ν•΄ 배열을 κ²°ν•©ν•œλ‹€. νƒ€μž…μŠ€ν¬λ¦½νŠΈλŠ” μž…λ ₯된 λ°°μ—΄ 쀑 ν•˜λ‚˜μ˜ 값이 κ²°κ³Ό 배열에 포함될 κ²ƒμž„μ„ μ΄ν•΄ν•œλ‹€.

λ§Œμ•½μ— μž…λ ₯된 배열이 λ™μΌν•œ νƒ€μž…μ΄λΌλ©΄ 좜λ ₯ 배열도 λ™μΌν•œ νƒ€μž…μ΄λ‹€. μ„œλ‘œ λ‹€λ₯Έ νƒ€μž…μ˜ 두 배열을 ν•¨κ»˜ μŠ€ν”„λ ˆλ“œμ— μƒˆ 배열을 μƒμ„±ν•˜λ©΄

μƒˆ 벼열은 두 개의 μ›λž˜ νƒ€μž… 쀑 μ–΄λŠ ν•˜λ‚˜μ˜ μš”μ†ŒμΈ μœ λ‹ˆμ–Έ νƒ€μž… λ°°μ—΄λ‘œ μ΄ν•΄λœλ‹€.

// string[]
const soldires = ["a", "b", "c"];

// number[]
const sodierAges = [1,2,3];

// (string | number)[]
const conjoined = [...soldires, ...sodierAges];

6.3.2 λ‚˜λ¨Έμ§€ λ§€κ°œλ³€μˆ˜ μŠ€ν”„λ ˆλ“œ

νƒ€μž…μŠ€ν¬λ¦½νŠΈλŠ” λ‚˜λ¨Έμ§€ λ§€κ°œλ³€μˆ˜λ‘œ 배열을 μŠ€ν”„λ ˆλ“œν•˜λŠ” μžλ°”μŠ€ν¬λ¦½νŠΈ 싀행을 μΈμ‹ν•˜κ³  이에 λŒ€ν•΄ νƒ€μž… 검사λ₯Ό μˆ˜ν–‰ν•œλ‹€.

λ‚˜λ¨Έμ§€ λ§€κ°œλ³€μˆ˜λ₯Ό μœ„ν•œ 인수둜 μ‚¬μš©λ˜λŠ” 배열은 λ‚˜λ¨Έμ§€ λ§€κ°œλ³€μˆ˜μ™€ λ™μΌν•œ λ°°μ—΄ νƒ€μž…μ„ κ°€μ Έμ•Ό ν•œλ‹€.

6.4 νŠœν”Œ

μžλ°”μŠ€ν¬λ¦½νŠΈ 배열은 이둠상 μ–΄λ–€ 크기라도 될 수 μžˆλ‹€. ν•˜μ§€λ§Œ λ–„λ‘œλŠ” νŠœν”Œμ΄λΌκ³  ν•˜λŠ” κ³ μ •λœ 크기의 배열을 μ‚¬μš©ν•˜λŠ” 것이 μœ μš©ν•˜λ‹€.

νŠœν”Œ 배열은 각 μΈλ±μŠ€μ— μ•Œλ €μ§„ νŠΉμ • νƒ€μž…μ„ κ°€μ§€λ©° λ°°μ—΄μ˜ λͺ¨λ“  κ°€λŠ₯ν•œ 멀버λ₯Ό κ°–λŠ” μœ λ‹ˆμ–Έ νƒ€μž…λ³΄λ‹€ 더 ꡬ체적이닀. νˆ¬ν”Œ νƒ€μž…μ„ μ„ μ–Έν•˜λŠ” ꡬ문은 λ°°μ—΄ λ¦¬ν„°λŸ΄ 처럼 λ³΄μ΄μ§€λ§Œ

μš”μ†Œμ˜ κ°’ λŒ€μ‹  νƒ€μž…μ„ μ λŠ”λ‹€.

let yearAndWarrior: [number, string];

yearAndWarrior = [1, "a"]; // OK

yearAndWarrior = [false, "1"]; // Error

yearAndWarrior = ["a", 1]; // Error

yearAndWarrior = [1]; // Error

6.4.1 νŠœν”Œ ν• λ‹Ή κ°€λŠ₯μ„±

νƒ€μž…μŠ€ν¬λ¦½νŠΈμ—μ„œ νŠœν”Œ νƒ€μž…μ€ κ°€λ³€ 길이의 λ°°μ—΄ νƒ€μž…λ³΄λ‹€ 더 ꡬ체적으둜 μ²˜λ¦¬λœλ‹€. κ°€λ³€ 길이의 λ°°μ—΄ νƒ€μž…μ€ νŠœν”Œ νƒ€μž…μ— ν• λ‹Ήν•  수 μ—†λ‹€.

pairLoose 내뢀에 [boolean, number] κ°€ μžˆλŠ” 것을 λ³Ό 수 μžˆμ§€λ§Œ νƒ€μž…μŠ€ν¬λ¦½νŠΈλŠ” 더 일반적인 (boolean | number)[] νƒ€μž…μœΌλ‘œ μœ μΆ”ν•œλ‹€.

const pariLoose = [false, 123];

λ‚˜λ¨Έμ§€ λ§€κ°œλ³€μˆ˜λ‘œμ„œμ˜ νŠœν”Œ

νŠœν”Œμ€ ꡬ체적인 길이와 μš”μ†Œ νƒ€μž… 정보λ₯Ό κ°€μ§€λŠ” λ°°μ—΄λ‘œ κ°„μ£Όλ˜λ―€λ‘œ ν•¨μˆ˜μ— 전달할 인수λ₯Ό μ €μž₯ν•˜λŠ” 데 특히 μœ μš©ν•˜λ‹€.

νƒ€μž…μŠ€ν¬λ¦½νŠΈλŠ” ... λ‚˜λ¨Έμ§€ λ§€κ°œλ³€μˆ˜λ‘œ μ „λ‹¬λœ νŠœν”Œμ— μ •ν™•ν•œ νƒ€μž… 검사λ₯Ό μ œκ³΅ν•  수 μžˆλ‹€.

function looPar(name: string, value: number) {
    console.log(`${name} has ${value}`);
}

const pairArray = ["Amage", 1];

looPar(...pairArray); // Error

const pariTupleIncorrect: [string, number] = ["Amage", 1];

looPar(...pairArray); // OK

λ‚˜λ¨Έμ§€ λ§€κ°œλ³€μˆ˜ νŠœν”Œμ„ μ‚¬μš©ν•˜κ³  μ‹Άλ‹€λ©΄ μ—¬λŸ¬ 번 ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜λŠ” 인수 λͺ©λ‘μ„ 배열에 μ €μž₯ν•΄ ν•¨κ»˜ μ‚¬μš©ν•  수 μžˆλ‹€.

function logTrio(name: string, value: [number, boolean]) {
    console.log(`${name} has ${value[0]} (${value[1]}`);
};

const trios: [string , [number, boolean][]] = [
    ["a", [1, true]],
    ["b", [2, false]],
    ["c", [3, true]],
]

trios.forEach(trio => logTrio(...trio)); // OK

6.4.2 νŠœν”Œ μΆ”λ‘ 

νƒ€μž…μŠ€ν¬λ¦½νŠΈλŠ” μƒμ„±λœ 배열을 νŠœν”Œμ΄ μ•„λ‹Œ κ°€λ³€ 길이의 λ°°μ—΄λ‘œ μ·¨κΈ‰ν•œλ‹€. 배열이 λ³€μˆ˜μ˜ μ΄ˆκΉƒκ°’ λ˜λŠ” ν•¨μˆ˜μ— λŒ€ν•œ λ°˜ν™˜κ°’μœΌλ‘œ μ‚¬μš©λ˜λŠ” 경우 κ³ μ •λœ 크기의 νŠœν”Œμ΄ μ•„λ‹ˆλΌ μœ μ—°ν•œ 크기의 λ°°μ—΄λ‘œ κ°€μ •ν•œλ‹€.

function firstCharAndSize(input: string) {
    return [input[0], input.length];
}

// firstChar Type = string | number;
// size Type = string | number;
const [firstChar, size] = firstCharAndSize("abc");

νƒ€μž…μŠ€ν¬λ¦½νŠΈμ—μ„œλŠ” 값이 일반적인 λ°°μ—΄ νƒ€μž… λŒ€μ‹  μ’€ 더 ꡬ체적인 νŠœν”Œ νƒ€μž…μ΄μ–΄μ•Ό 함을 λ‹€μŒ 두 κ°€μ§€ λ°©λ²•μœΌλ‘œ λ‚˜νƒ€λ‚Έλ‹€. λͺ…μ‹œμ  νŠœν”Œ νƒ€μž…κ³Ό const μ–΄μ‹œμ…˜μ„ μ‚¬μš©ν•œ 방법이닀.

λͺ…μ‹œμ  νŠœν”Œ νƒ€μž…

ν•¨μˆ˜μ— λŒ€ν•œ λ°˜ν™˜ νƒ€μž… μ• λ„ˆν…Œμ΄μ…˜μ²˜λŸΌ νŠœν”Œ νƒ€μž…λ„ νƒ€μž… μ• λ„ˆν…Œμ΄μ…˜μ— μ‚¬μš©ν•  수 μžˆλ‹€. ν•¨μˆ˜κ°€ νŠœν”Œ νƒ€μž…μ„ λ°˜ν™˜ν•œλ‹€κ³ μ„ μ–Έλ˜κ³  λ°°μ—΄ λ¦¬ν„°λŸ΄μ„ λ°˜ν™˜ν•œλ‹€λ©΄ ν•΄λ‹Ή λ°°μ—΄ λ¦¬ν„°λŸ΄μ€ 일반적인 κ°€λ³€ 길이의 λ°°μ—΄ λŒ€μ‹  νŠœν”Œλ‘œ κ°„μ£Όλœλ‹€.

function firstCharAndSizeExplicit(input: string): [string, number] {
    return [input[0], input.length];
};

const μ–΄μ‹œμ…˜

λͺ…μ‹œμ  νƒ€μž… μ• λ„ˆν…Œμ΄μ…˜μ— νŠœν”Œ νƒ€μž…μ„ μž…λ ₯ν•˜λŠ” μž‘μ—…μ€ λͺ…μ‹œμ  νƒ€μž… μ• λ„ˆν…Œμ΄μ…˜μ„ μž…λ ₯ν•  λ•Œμ™€ λ™μΌν•œ 이유둜 κ³ ν†΅μŠ€λŸ¬μšΈ 수 μžˆλ‹€. 즉 μ½”λ“œ 변경에 따라 μž‘μ„± 및 μˆ˜μ •μ΄ ν•„μš”ν•œ ꡬ문을 μΆ”κ°€ν•΄μ•Ό ν•œλ‹€.

ν•˜μ§€λ§Œ κ·Έ λŒ€μ•ˆμœΌλ‘œ νƒ€μž…μŠ€ν¬λ¦½νŠΈλŠ” κ°’ 뒀에 넣을 수 μžˆλŠ” const μ–΄μ‹œμ…˜μΈ as const μ—°μ‚°μžλ₯Ό μ œκ³΅ν•œλ‹€.

const unionArray  = [1156, "a"]; // (string | number)[];

const readOnlyTuple = [11, "a"] as const; // readonly [1157, "a"]