ν°μ€ν 리 λ·°
Typescriptμμ Object.keys()κ° νμ string[] νμ μΈ μ΄μ
parkcool 2026. 1. 12. 14:46type Product = "apple" | "banana" | "orange";
const menu: Record<Product, number> = {
apple: 1000,
banana: 2000,
orange: 1500
};
const products = Object.keys(menu);
// productsμ νμ
μ?
μμ κ°μ Typescript μ½λμμ, `products`μ νμ μ λλ‘ μΆλ‘ λ κΉ? `menu`λ `Record<Product, number>` νμ μ κ°μ²΄λκΉ, μ΄ κ°μ²΄μ ν€μ νμ μ ProductμΌ κ²μ΄λ€. `Object.keys()` λ©μλλ κ°μ²΄μ λͺ¨λ ν€λ₯Ό λ°°μ΄λ‘ λ°ννλ λ©μλμ΄λ€. λ°λΌμ `products`μ νμ μ `Product[]`λ‘ μΆλ‘ λλ κ²μ΄ λ§λ νλ€.

νμ§λ§, μ΄ κΈμ μ λͺ©μλ λμμλ€μνΌ, μ λ΅μ `string[]`μ΄λ€. μ§μ νμΈν΄λ³΄κ³ μΆμΌμλ€λ©΄ TS Playgroundμμ νμΈν΄λ³Ό μ μλ€.

μ΄μ κ° λκΉ? `menu`μ ν€λ `Product` νμ μμ΄ νμ€νμ§ μλ? κ·Έλ°λ° μ κ΅³μ΄ λ λμ λ²μμΈ `string[]`μΌλ‘ μΆλ‘ λλ κ²μΌκΉ? μ€μ λ‘ μ΄ νμμ λ²κ·ΈλΌκ³ μκ°ν ν μ¬λμ΄ Typescript λ ν¬μ§ν 리μ μ΄μλ₯Ό μ¬λ¦° μ μ΄ μλ€.
This is intentional. Types in TS are open ended. So keysof will likely be less than all properties you would get at runtime.
λ΅λ³μ λ¨νΈνλ€. μλμ μΈ μ€κ³λΌκ³ λ§νλ€. λλ¬΄μ§ λ©λν μ μλ€. κ·Έ μ΄μ λ 무μμΌκΉ?
π Typescriptμ ꡬ쑰μ νμ΄ν
TypeScriptμ ν΅μ¬ μ² ν μ€ νλλ ꡬ쑰μ νμ΄νμ΄λ€. μ΄λ νμ μ μκ° "μ΄ μμ±λ€λ§ κ°μ§κ³ μμ΄μΌ νλ€."κ° μλλΌ, "μ μ΄λ μ΄ μμ±λ€μ κ°μ§κ³ μμ΄μΌ νλ€"λ μλ―Έλ€.
μ΄ν΄λ₯Ό λκΈ° μν΄ μλ μμλ₯Ό λ΄λ³΄μ.
interface Person {
name: string;
}
const student = {
name: "Sean",
grade: 3,
};
const person: Person = student;
`person` λ³μλ `Person` νμ μΌλ‘ μ μΈλμμ§λ§, μ€μ λ°νμμλ `grade`λΌλ μΆκ° μμ±μ κ°μ§ κ°μ²΄κ° ν λΉλ μ μλ€. νμ μ€ν¬λ¦½νΈμ νμ μ κ°μ²΄μ λͺ¨λ ννλ₯Ό νμ μ§λ κ²μ΄ μλλΌ, μ΅μνμ 쑰건μ κ²μ¬ν λΏμ΄λ€.
π£ λ§μ½ string[]μ΄ μλλΌλ©΄
Object.keys(person).forEach((key) => {
console.log(person[key].toUpperCase());
});
Typescriptκ° `Object.keys(person)`μ νμ μ `("name")[]`μΌλ‘ μΆλ‘ νλ€κ³ κ°μ νμ.
- λ°λ³΅λ¬Έ λ΄μ `key`λ 무쑰건 "name"μ΄λΌκ³ μΆλ‘ λλ€.
- λ°λ³΅λ¬Έ λ΄μ `person[key]`λ 무쑰건 `string`μΌλ‘ μΆλ‘ λλ€.
- `string`μλ `toUpperCase()` λ©μλκ° μκΈ° λλ¬Έμ, μ€λ₯κ° μλ€ !
νμ§λ§ μ€μ λ‘ λ°νμμμμ μν©μ μ΄ν΄λ³΄μ.
- λ°λ³΅λ¬Έ λ΄μ `key`λ "name"μΌ μλ, "grade"μΌ μλ μλ€.
- λ°λ³΅λ¬Έ λ΄μ `person[key]`λ `string`μΌ μλ, `number`μΌ μλ μλ€.
- `number`μλ `toUpperCase()` λ©μλκ° μκΈ° λλ¬Έμ, λ°νμ μ€λ₯κ° λ°μνλ€ !
κ²°κ³Όμ μΌλ‘ κ°λ°μλ μ»΄νμΌλ¬λ₯Ό λ―Ώκ³ `toUpperCase()` λ©μλλ₯Ό μΌμ§λ§, λ°νμ μλ¬κ° λ°μνλ κ²μ΄λ€. μ΄λ¬ν μ΄μ μμ Typescriptλ `Object.keys()` λ©μλμ λ°ν νμ μ `string[]`μΌλ‘ μ€μ νλ 보μμ μΈ μ νμ ν κ²μ΄λ€.
β ν΄κ²°λ²
λ°©λ² 1. νμ λ¨μΈ
const products = Object.keys(menu) as Product[];
κ°μ₯ κ°λ¨νμ§λ§, κ°λ°μκ° μ€μνλ©΄ λ°νμ μλ¬λ‘ μ΄μ΄μ§ μ μλ€.
λ°©λ² 2. νμ κ°λ + νν°λ§
type Product = "apple" | "banana" | "orange";
const PRODUCT_KEYS: Product[] = ["apple", "banana", "orange"];
const menu = {
apple: 1000,
banana: 2000,
orange: 1500,
grade: 3
};
function isProductKey(key: string): key is Product {
return PRODUCT_KEYS.includes(key);
}
const safeKeys = Object.keys(menu).filter(isProductKey);
ν€ λ°°μ΄μ 미리 λ§λ€μ΄λκ³ , `Object.keys`λ‘ λμ¨ ν€λ€μ΄ κ·Έ λͺ©λ‘μ μλμ§ νμΈν΄μ κ±Έλ¬λ΄λ λ°©λ²μ΄λ€. μ΄ λ°©μμ μ°λ©΄ μμνμ§ μμ ν€(`grade`)κ° κ°μ²΄μ μμ¬ μμ΄λ filter() λ©μλμμ κ±Έλ¬μ§λ€. λ°λΌμ κ²°κ³Ό λ°°μ΄μλ `Product`λ§ λ¨κ² λκ³ , `safeKeys` μμ νμ κ°λμ μν΄ `Product[]` νμ μΌλ‘ μΆλ‘ λλ€.
νμ§λ§ `PRODUCT_KEYS`λΌλ λ°°μ΄μ λ°λ‘ κ΄λ¦¬ν΄μΌ νλ€λ λ²κ±°λ‘μμ΄ μλ€.
λ°©λ² 3. Zod μ¬μ©νκΈ°
import { z } from "zod";
const ProductSchema = z.enum(["apple", "banana", "orange"]);
type Product = z.infer<typeof ProductSchema>;
const menu = {
apple: 1000,
banana: 2000,
grade: 3,
};
const keys = Object.keys(menu);
const safeKeys = keys.filter((key): key is Product => {
const result = ProductSchema.safeParse(key);
return result.success;
});
console.log(safeKeys);
ν€ λ°°μ΄ μμ±κ³Ό κ²μ¦ λ‘μ§μ Zodμκ² λ§‘κΈ°λ λ°©λ²μ΄λ€. ν€ λ°°μ΄μ λ°λ‘ λ§λ€ νμλ μκ³ , νν°λ§ λ‘μ§λ μ§μ ꡬνν νμκ° μμ΄μ κ·Έλλ§ νΈνκΈ΄ νλ€. κ·Έλ¬λ λ°νμ μ κ²μ¦ λΉμ©μ΄ μ‘°κΈ λ°μν μλ μκ³ , μμλ μ½λ κΈΈμ΄κ° κΈΈμ΄μ§λ€λ λ¨μ μ μ‘΄μ¬νλ€.
κ²°κ΅μλ μμ μ±κ³Ό νΈμμ±μ νΈλ μ΄λμ€νμΈ κ² κ°λ€. μν©μ λ°λΌ κ°λ°μκ° μ μ ν μ ννλ κ²μ΄ λ§μ 보μΈλ€.
π‘ κ²°λ‘
TypeScriptκ° `Object.keys()`λ₯Ό `string[]`μΌλ‘ μΆλ‘ νλ κ²μ λ²κ·Έκ° μλλΌ, ꡬ쑰μ νμ΄νμΌλ‘λΆν° λ°μνλ λ°νμ μλ¬λ₯Ό λ°©μ§νκΈ° μν μμ μ₯μΉμ΄λ€.
λΆνΈνκ² λκ»΄μ§ μλ μμ§λ§, μ΄λ Typescriptκ° νλ‘κ·Έλ¨μ μμ μ±μ 보μ₯νκΈ° μν νλμ΄κΈ°λ νλ€. μ΄ μ리λ₯Ό μ΄ν΄νκ³ μμμ μΈκΈν ν΄κ²°λ²μ μ μ ν μ μ©νλ κ²μ΄ νλͺ ν μ¬μ©λ²μΌ κ²μ΄λ€.
'π κ³΅λΆ > Javascript' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
| μ€ν 컨ν μ€νΈ (0) | 2025.11.07 |
|---|