2024-06-19.md
๐กDIL: ์ดํํฐ๋ธ ํ์ ์คํฌ๋ฆฝํธ
์คํฐ๋: ์๊ฐ CS, https://github.com/monthly-cs/2024-05-effective-typescript
์์ฑ์ผ: 2024-06-19
์์ฑ์: dusunax
์์ดํ 54: ๊ฐ์ฒด๋ฅผ ์ํํ๋ ๋ ธํ์ฐ Know How to Iterate Over Objects
const obj = {
one: "uno",
two: "dos",
three: "tres",
};
for (const k in obj) {
// const k: string ๊ฐ์ฒด๋ฅผ ์ํํ๋ ๋ฃจํ ๋ด์ ์์ k๋ string
const v = obj[k]; // obj ๊ฐ์ฒด์๋ ์ธ ๊ฐ์ key๋ง ์กด์ฌ (k์ obj ๊ฐ์ฒด์ ํค ํ์
์ด ์๋ก ๋ค๋ฅด๊ฒ ์ถ๋ก )
// ~~~~~~ Element implicitly has an 'any' type
// because type ... has no index signature
}
let k: keyof typeof obj;
- k์ ํ์ ์ด "one", "two", "three"๊ฐ ์๋๋ผ string์ผ๋ก ์ถ๋ก ๋๋ ์ด์ ?
interface ABC {
a: string;
b: string;
c: number;
}
function foo(abc: ABC) {
for (const k in abc) {
// ^? const k: string
const v = abc[k];
// ~~~~~~ Element implicitly has an 'any' type
// because type 'ABC' has no index signature
}
}
const x = { a: "a", b: "b", c: 2, d: new Date() }; // ABC์ ํธํ๋๋ ๊ฐ์ฒด
foo(x); // ๊ตฌ์กฐ์ ํ์ดํ OK
// ABC ํ์
์ 'ํ ๋น ๊ฐ๋ฅํ " ์ด๋ค ๊ฐ์ด๋ ๋งค๊ฐ๋ณ์๋ก ํ์ฉํ๊ธฐ ๋๋ฌธ
// ํ์
์คํฌ๋ฆฝํธ๋ ABC ํ์
์ ํค๋ฅผ string์ผ๋ก ์ ํํ๋ค.
// ๋ง์ฐฌ๊ฐ์ง๋ก ์๋์ ๊ฒฝ์ฐ, v๋ฅผ string | number๋ก๋ง ์ถ๋ก ํ๋ฉด ์ค๋ฅ๊ฐ ์๊ธธ ์ ์์
function foo(abc: ABC) {
const keys = ["a", "b", "c"] as const;
for (const k of keys) {
// ^? const k: "a" | "b" | "c"
const v = abc[k];
// ^? const v: string | number
}
}
- ๋จ์ํ ๊ฐ์ฒด์ ํค์ ๊ฐ์ ์ํํ๋ค๋ฉด? Object.entries
ํ๋กํ ํ์ ์ค์ผ
Object.prototype.z = 3;
- for-in ๋ฃจํ์์ k๊ฐ string์ด๋ผ๋ฉด? ํ๋กํ ํ์ ์ค์ผ ๊ฐ๋ฅ์ฑ
- keyof ์ ์ธ์ ์์๊ฑฐ๋, ์ถ๊ฐ์ ์ธ ํค ์์ด ์ ํํ ํ์ ์ ์ํ๋ ๊ฒฝ์ฐ๊ฐ ์ ์ ํจ
Map
- Map์ ๋ฐ๋ณต(iteration)์ ์ฝ๊ฒ ํ๊ธฐ ์ํด ๋ค์ํ ๋ฉ์๋๋ฅผ ์ ๊ณตํจ
- forEach, entries, keys, values
- Map์ ํญ๋ชฉ์ด ์ฝ์ ๋ ์์๋ฅผ ๊ธฐ์ตํ๊ณ ๊ทธ ์์๋ฅผ ์ ์ง => ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ ์์๋๋ก ๋ฐ๋ณตํ ์ ์์
- ๊ฐ์ฒด๋ฅผ ๋ฐ๋ณตํ๋ ค๋ฉด Object.keys, Object.values, Object.entries์ ๊ฐ์ ๋ฉ์๋๋ฅผ ์ฌ์ฉํจ (๊ฐ์ฒด๋ณด๋ค Map์ด ๋ ์ง๊ด์ )
const m = new Map([
["one", "uno"],
["two", "dos"],
["three", "tres"],
]);
// ^? const m: Map<string, string>
// ๋ชจ๋ ํญ๋ชฉ์ ์ํ
m.forEach((value, key) => {
console.log(`${key}: ${value}`);
});
// entries() ์ฌ์ฉ
for (const [key, value] of m.entries()) {
console.log(`${key}: ${value}`);
}
// keys() ์ฌ์ฉ
for (const key of m.keys()) {
console.log(key);
}
// values() ์ฌ์ฉ
for (const value of m.values()) {
console.log(value);
}
- ํฌ๊ธฐ์ ๊ฒฝ์ฐ
- ๊ฐ์ฒด: Object.keys(obj).length
- Map: size ์์ฑ์ผ๋ก ์ง์ ์ ๊ทผ ๊ฐ๋ฅ
Things to Remember
- Be aware that any objects your function receives as parameters might have additional keys.
- ํจ์์ ๋งค๊ฐ๋ณ์ ๊ฐ์ฒด์ ์ถ๊ฐ์ ์ธ ํค๊ฐ ์์ ์ ์๋ค๋ ์ ์ ์์๋๊ธฐ
- Use Object.entries to iterate over the keys and values of any object.
- ๊ฐ์ฒด๋ฅผ ์ํํ๋ฉฐ ํค์ ๊ฐ์ ์ป๋ ๋ฐฉ๋ฒ: Object.entries
- Use a for-in loop with an explicit type assertion to iterate objects when you know exactly what the keys will be.
- ๊ฐ์ฒด๋ฅผ ์ํํ ๋, ํค๊ฐ ์ด๋ค ํ์ ์ธ์ง ์ ํํ ํ์ ํ๊ณ ์๋ค๋ฉด for-in ๋ฃจํ๋ฅผ ์ฌ์ฉํ๋ค. (let k: keyof T)
- Consider Map as an alternative to objects since it's easier to iterate over.
- ๋งต์ด ์ํํ๊ธฐ ๋ ์ฝ๋ค. object๋ฅผ ๋์ฒดํ์ฌ ์ฌ์ฉํ ์ ์์