728x90
π Effective TypeScript μ± μ μ½κ³ 곡λΆν λ΄μ©μ μ 리ν κΈμ λλ€.
number μΈλ±μ€ μκ·Έλμ²λ³΄λ€λ Array, νν, ArrayLike μ¬μ©νκΈ°
μλ°μ€ν¬λ¦½νΈμμ κ°μ²΄λ?
- ν€/κ° μμ λͺ¨μ
- ν€λ λ³΄ν΅ λ¬Έμμ΄
- κ°μ μ΄λ€ 무μμ΄λ λ μ μλ€
- νμ΄μ¬, μλ°μμ λ³Ό μ μλ βν΄μ κ°λ₯β κ°μ²΄ ννμ΄ μλ°μ€ν¬λ¦½νΈμλ μλ€.
toString
λ©μλκ° νΈμΆλμ΄ κ°μ²΄κ° λ¬Έμμ΄λ‘ λ³νλμ΄ λ²λ¦°λ€.
> x={}
{}
> x[[1,2,3]] = 2
2
> x
{ '1,2,3': 1 }
- μ«μλ ν€λ‘ μ¬μ©ν μ μλ€.
- μλ°μ€ν¬λ¦½νΈ λ°νμμ΄ λ¬Έμμ΄λ‘ λ³νν΄ λ²λ¦°λ€.
> { 1: 2, 3: 4 }
{ '1': 2, '3': 4 }
- λ°°μ΄μ λΆλͺ
ν κ°μ²΄μ΄λ€
- λλ¬Έμ μ«μ μΈλ±μ€λ₯Ό μ¬μ©νλ κ²μ΄ λΉμ°νλ€.
> typeof []
'object'
> x = [1, 2, 3]
[1, 2, 3]
> x[0]
1
- μμ μΈλ±μ€λ€μ λ¬Έμμ΄λ‘ λ³νλμ΄ μ¬μ©λλ€.
- λ¬Έμμ΄ ν€λ₯Ό μ¬μ©ν΄λ μμ λ°°μ΄μ μμμ μ κ·Όν μ μλ€.
> x['1']
2
Object.keys
λ₯Ό μ΄μ©ν΄ λ°°μ΄μ ν€λ₯Ό λμ΄νλ©΄, ν€κ° λ¬Έμμ΄λ‘ μΆλ ₯λλ€.
> Object.keys(x)
[ '0', '1', '2' ]
λ°λΌμ, μ΄λ¬ν νΌλμ λ°λ‘μ‘κΈ° μν΄ νμ μ€ν¬λ¦½νΈλ μ«μ ν€λ₯Ό νμ©νκ³ , λ¬Έμμ΄ ν€μ λ€λ₯Έ κ²μΌλ‘ μΈμνλ€.
interface Array<T> {
// ...
[n: number]: T;
}
- λ¬Έμμ΄ ν€λ‘ μΈμνλ―λ‘, νμ
μ²΄ν¬ μμ μ μ€λ₯λ₯Ό μ‘μ μ μλ€.
- μ€μ λ‘ λμνμ§ μλ μ½λμ΄λ€.
- νμ μμ€ν μ λ€λ₯Έ κ²λ€κ³Ό λ§μ°¬κ°μ§λ‘, νμ μ 보λ λ°νμμ μ κ±°λλ€.
const xs = [1, 2, 3];
const x0 = xs[0]; // OK
const x1 = xs['1'];
// ~~~ Element implicitly has an 'any' type
// because index expression is not of type 'number'
function get<T>(array: T[], k: string): T {
return array[k];
// ~ Element implicitly has an 'any' type
// because index expression is not of type 'number'
}
Object.keys
κ°μ ꡬ문μ μ¬μ ν λ¬Έμμ΄λ‘ λ°νλλ€.- stringμ΄ numberμ ν λΉλ μ μκΈ° λλ¬Έμ, λ§μ§λ§ μ€μ΄ μ΄μνκ² λ³΄μΌ μ μλ€.
β λ°°μ΄μ μννλ μ½λ μ€νμΌμ λν μ€μ©μ μΈ νμ©μ΄λΌ μκ°νλ©΄ μ’λ€ !
β μλ°μ€ν¬λ¦½νΈμμλ νν μΌμ΄μ§λ§, λ°°μ΄μ μννκΈ° μ’μ λ°©λ²μ μλλ€.
- stringμ΄ numberμ ν λΉλ μ μκΈ° λλ¬Έμ, λ§μ§λ§ μ€μ΄ μ΄μνκ² λ³΄μΌ μ μλ€.
const xs = [1, 2, 3];
const keys = Object.keys(xs); // Type is string[]
for (const key in xs) {
key; // Type is string
const x = xs[key]; // Type is number
}
- μΈλ±μ€μ μ κ²½ μ°μ§ μλλ€λ©΄,
for-of
λ₯Ό μ¬μ©νλ κ²μ΄ μ’λ€.
const xs = [1, 2, 3];
for (const x of xs) {
x; // Type is number
}
- μΈλ±μ€μ νμ
μ΄ μ€μνλ©΄, number νμ
μ μ 곡ν΄μ€
forEach
λ₯Ό μ¬μ©νλ©΄ λλ€.
const xs = [1, 2, 3];
xs.forEach((x, i) => {
i; // Type is number
x; // Type is number
});
- 루ν μ€κ°μ λ©μΆ°μΌ νλ€λ©΄, C μ€νμΌμ
for(;;)
루νκ° μ’λ€.
const xs = [1, 2, 3];
for (let i = 0; i < xs.length; i++) {
const x = xs[i];
if (x < 0) break;
}
β μ±λ₯ μ²΄ν¬ κ°λ₯νμ§ νμΈ
μΈλ±μ€ μκ·Έλμ²κ° numberλ‘ ννλμ΄ μλ€λ©΄
- μ λ ₯ν κ°μ΄ number μ¬μΌ νλ€λ κ²μ μλ―Ένμ§λ§ (for-in 루ν μ μΈ)
- μ€μ λ°νμμ μ¬μ©λλ ν€λ string νμ
μΌλ°μ μΌλ‘ string λμ numberλ₯Ό νμ μ μΈλ±μ€ μκ·Έλμ²λ‘ μ¬μ©νλ κ²½μ°λ λ§μ§ μλ€.
νμ§λ§ λ§μ½ μ«μλ₯Ό μ¬μ©ν΄μ μΈλ±μ€ νλͺ©μ μ§μ νλ€λ©΄
- Array λλ νν νμ μ λμ μ¬μ©νκ² λ κ²μ΄λ€.
μ΄λ ν κΈΈμ΄λ₯Ό κ°μ§λ λ°°μ΄κ³Ό λΉμ·ν ννμ ννμ μ¬μ©νκ³ μΆλ€λ©΄
β νμ
μ€ν¬λ¦½νΈμ μλ ArrayLike
νμ
μ μ¬μ©νλ€.
const xs = [1, 2, 3];
function checkedAccess<T>(xs: ArrayLike<T>, i: number): T {
if (i < xs.length) {
return xs[i];
}
throw new Error(`Attempt to access ${i} which is past end of array.`)
}
ArrayLike
λ₯Ό μ¬μ©νλλΌλ ν€λ μ¬μ ν λ¬Έμμ΄
const xs = [1, 2, 3];
const tupleLike: ArrayLike<string> = {
'0': 'A',
'1': 'B',
length: 2,
}; // OK
Uploaded by N2T
728x90
λ°μν