TypeScriptμ nominal branding κΈ°λ²μ νμνμ¬ opaque νμ μ λ§λ€κ³ , νμ μμ μ±μ κ°μ νλ©°, μλνμ§ μμ νμ λμ μ λ°©μ§νλ λ°©λ²μ μμ보μΈμ. μ€μ©μ μΈ κ΅¬νκ³Ό κ³ κΈ μ¬μ© μ¬λ‘λ₯Ό λ°°μλλ€.
TypeScript Nominal Brands: ν₯μλ νμ μμ μ±μ μν Opaque Type μ μ
TypeScriptλ μ μ νμ΄νμ μ 곡νμ§λ§, μ£Όλ‘ κ΅¬μ‘°μ νμ΄ν(structural typing)μ μ¬μ©ν©λλ€. μ΄λ νμ μ΄ μ μΈλ μ΄λ¦κ³Ό μκ΄μμ΄ λμΌν ννλ₯Ό κ°μ§λ©΄ νΈνλλ κ²μΌλ‘ κ°μ£Όλ¨μ μλ―Έν©λλ€. μ΄λ¬ν μ μ°μ±μ λλλ‘ μλνμ§ μμ νμ λ체μ νμ μμ μ± μ νλ‘ μ΄μ΄μ§ μ μμ΅λλ€. Nominal branding, μ¦ λΆν¬λͺ νμ μ μ(opaque type definitions)λ TypeScript λ΄μμ nominal νμ΄νμ κ°κΉμ΄ λ κ²¬κ³ ν νμ μμ€ν μ ꡬνν μ μλ λ°©λ²μ μ 곡ν©λλ€. μ΄ μ κ·Όλ²μ νμ μ΄ κ³ μ ν μ΄λ¦μ κ°μ§ κ²μ²λΌ λμνκ² λ§λλ μ리ν κΈ°λ²μ μ¬μ©νμ¬, μ°λ°μ μΈ νΌμ©μ λ°©μ§νκ³ μ½λμ μ νμ±μ 보μ₯ν©λλ€.
ꡬ쑰μ νμ΄ν vs. Nominal νμ΄ν μ΄ν΄νκΈ°
Nominal brandingμ μμΈν μμ보기 μ μ, ꡬ쑰μ νμ΄νκ³Ό nominal νμ΄νμ μ°¨μ΄μ μ μ΄ν΄νλ κ²μ΄ μ€μν©λλ€.
ꡬ쑰μ νμ΄ν
ꡬ쑰μ νμ΄νμμλ λ νμ μ΄ λμΌν ꡬ쑰(μ¦, λμΌν νμ μ λμΌν μμ±)λ₯Ό κ°μ§λ©΄ νΈνλλ κ²μΌλ‘ κ°μ£Όλ©λλ€. λ€μ TypeScript μμ λ₯Ό μ΄ν΄λ³΄κ² μ΅λλ€:
interface Kilogram { value: number; }
interface Gram { value: number; }
const kg: Kilogram = { value: 10 };
const g: Gram = { value: 10000 };
// TypeScriptλ λ νμ
μ΄ λμΌν ꡬ쑰λ₯Ό κ°μ§κΈ° λλ¬Έμ μ΄λ₯Ό νμ©ν©λλ€
const kg2: Kilogram = g;
console.log(kg2);
`Kilogram`κ³Ό `Gram`μ΄ μλ‘ λ€λ₯Έ μΈ‘μ λ¨μλ₯Ό λνλμλ λΆκ΅¬νκ³ , TypeScriptλ λ λ€ `number` νμ μ `value` μμ±μ κ°μ§κ³ μκΈ° λλ¬Έμ `Gram` κ°μ²΄λ₯Ό `Kilogram` λ³μμ ν λΉνλ κ²μ νμ©ν©λλ€. μ΄λ μ½λμμ λ Όλ¦¬μ μ€λ₯λ‘ μ΄μ΄μ§ μ μμ΅λλ€.
Nominal νμ΄ν
λ°λ©΄, nominal νμ΄νμ λ νμ μ΄ λμΌν μ΄λ¦μ κ°κ±°λ νλκ° λ€λ₯Έ νλλ‘λΆν° λͺ μμ μΌλ‘ νμλ κ²½μ°μλ§ νΈνλλ κ²μΌλ‘ κ°μ£Όν©λλ€. Javaλ C#κ³Ό κ°μ μΈμ΄λ€μ μ£Όλ‘ nominal νμ΄νμ μ¬μ©ν©λλ€. λ§μ½ TypeScriptκ° nominal νμ΄νμ μ¬μ©νλ€λ©΄, μ μμ λ νμ μ€λ₯λ₯Ό λ°μμμΌ°μ κ²μ λλ€.
TypeScriptμμ Nominal Brandingμ νμμ±
TypeScriptμ ꡬ쑰μ νμ΄νμ μ μ°μ±κ³Ό μ¬μ© νΈμμ± μΈ‘λ©΄μμ μΌλ°μ μΌλ‘ μ μ©ν©λλ€. νμ§λ§ λ Όλ¦¬μ μ€λ₯λ₯Ό λ°©μ§νκΈ° μν΄ λ μ격ν νμ κ²μ¬κ° νμν μν©μ΄ μμ΅λλ€. Nominal brandingμ TypeScriptμ μ₯μ μ ν¬μνμ§ μμΌλ©΄μ μ΄λ¬ν μ격ν κ²μ¬λ₯Ό λ¬μ±νκΈ° μν ν΄κ²°μ± μ μ 곡ν©λλ€.
λ€μ μλ리μ€λ₯Ό κ³ λ €ν΄λ³΄μΈμ:
- ν΅ν μ²λ¦¬: `USD`μ `EUR` κΈμ‘μ ꡬλΆνμ¬ μ°λ°μ μΈ ν΅ν νΌμ©μ λ°©μ§ν©λλ€.
- λ°μ΄ν°λ² μ΄μ€ ID: `UserID`κ° `ProductID`κ° νμν κ³³μ μ€μλ‘ μ¬μ©λμ§ μλλ‘ λ³΄μ₯ν©λλ€.
- μΈ‘μ λ¨μ: `Meters`μ `Feet`λ₯Ό ꡬλ³νμ¬ μλͺ»λ κ³μ°μ νΌν©λλ€.
- 보μ λ°μ΄ν°: μΌλ° ν μ€νΈ `Password`μ ν΄μλ `PasswordHash`λ₯Ό ꡬλΆνμ¬ λ―Όκ°ν μ λ³΄κ° μ€μλ‘ λ ΈμΆλλ κ²μ λ°©μ§ν©λλ€.
μ΄λ¬ν κ° κ²½μ°μμ, ꡬ쑰μ νμ΄νμ λ νμ μ κΈ°λ³Έ νν(μ: μ«μ λλ λ¬Έμμ΄)μ΄ λμΌνκΈ° λλ¬Έμ μ€λ₯λ‘ μ΄μ΄μ§ μ μμ΅λλ€. Nominal brandingμ μ΄λ¬ν νμ λ€μ κ΅¬λ³ κ°λ₯νκ² λ§λ€μ΄ νμ μμ μ±μ κ°μ νλ λ° λμμ μ€λλ€.
TypeScriptμμ Nominal Brands ꡬννκΈ°
TypeScriptμμ nominal brandingμ ꡬννλ λ°©λ²μλ μ¬λ¬ κ°μ§κ° μμ΅λλ€. μ¬κΈ°μλ κ΅μ°¨ νμ (intersections)κ³Ό κ³ μ μ¬λ³Ό(unique symbols)μ μ¬μ©νλ μΌλ°μ μ΄κ³ ν¨κ³Όμ μΈ κΈ°λ²μ μ΄ν΄λ³΄κ² μ΅λλ€.
κ΅μ°¨ νμ κ³Ό κ³ μ μ¬λ³Ό μ¬μ©νκΈ°
μ΄ κΈ°λ²μ κ³ μ μ¬λ³Όμ μμ±νκ³ μ΄λ₯Ό κΈ°λ³Έ νμ κ³Ό κ΅μ°¨μν€λ κ²μ ν¬ν¨ν©λλ€. κ³ μ μ¬λ³Όμ ν΄λΉ νμ μ λμΌν ꡬ쑰λ₯Ό κ°μ§ λ€λ₯Έ νμ κ³Ό ꡬλ³νλ "λΈλλ" μν μ ν©λλ€.
// Kilogram λΈλλλ₯Ό μν κ³ μ μ¬λ³Ό μ μ
const kilogramBrand: unique symbol = Symbol();
// κ³ μ μ¬λ³Όλ‘ λΈλλ©λ Kilogram νμ
μ μ
type Kilogram = number & { readonly [kilogramBrand]: true };
// Gram λΈλλλ₯Ό μν κ³ μ μ¬λ³Ό μ μ
const gramBrand: unique symbol = Symbol();
// κ³ μ μ¬λ³Όλ‘ λΈλλ©λ Gram νμ
μ μ
type Gram = number & { readonly [gramBrand]: true };
// Kilogram κ°μ μμ±νλ ν¬νΌ ν¨μ
const Kilogram = (value: number) => value as Kilogram;
// Gram κ°μ μμ±νλ ν¬νΌ ν¨μ
const Gram = (value: number) => value as Gram;
const kg: Kilogram = Kilogram(10);
const g: Gram = Gram(10000);
// μ΄μ TypeScript μ€λ₯κ° λ°μν©λλ€
// const kg2: Kilogram = g; // 'Gram' νμ
μ 'Kilogram' νμ
μ ν λΉν μ μμ΅λλ€.
console.log(kg, g);
μ€λͺ :
- `Symbol()`μ μ¬μ©νμ¬ κ³ μ μ¬λ³Όμ μ μν©λλ€. `Symbol()`μ νΈμΆν λλ§λ€ κ³ μ ν κ°μ΄ μμ±λλ―λ‘, μ°λ¦¬μ λΈλλκ° μλ‘ κ΅¬λ³λ¨μ 보μ₯ν©λλ€.
- `Kilogram`κ³Ό `Gram` νμ μ `number`μ κ³ μ μ¬λ³Όμ ν€λ‘ νκ³ `true` κ°μ κ°λ κ°μ²΄μ κ΅μ°¨ νμ μΌλ‘ μ μν©λλ€. `readonly` μμ μλ λΈλλκ° μμ±λ ν μμ λ μ μμμ 보μ₯ν©λλ€.
- νμ λ¨μΈ(`as Kilogram`, `as Gram`)μ μ¬μ©νλ ν¬νΌ ν¨μ(`Kilogram`, `Gram`)λ₯Ό μ¬μ©νμ¬ λΈλλ©λ νμ μ κ°μ μμ±ν©λλ€. TypeScriptκ° λΈλλ©λ νμ μ μλμΌλ‘ μΆλ‘ ν μ μκΈ° λλ¬Έμ μ΄ κ³Όμ μ΄ νμν©λλ€.
μ΄μ , `Gram` κ°μ `Kilogram` λ³μμ ν λΉνλ €κ³ ν λ TypeScriptκ° μ ννκ² μ€λ₯λ₯Ό νμν©λλ€. μ΄λ νμ μμ μ±μ κ°μ νκ³ μ°λ°μ μΈ νΌμ©μ λ°©μ§ν©λλ€.
μ¬μ¬μ©μ±μ μν μ λ€λ¦ λΈλλ©
κ° νμ μ λν΄ λΈλλ© ν¨ν΄μ λ°λ³΅νμ§ μμΌλ €λ©΄, μ λ€λ¦ ν¬νΌ νμ μ λ§λ€ μ μμ΅λλ€:
type Brand = K & { readonly __brand: unique symbol; };
// μ λ€λ¦ Brand νμ
μ μ¬μ©νμ¬ Kilogram μ μ
type Kilogram = Brand;
// μ λ€λ¦ Brand νμ
μ μ¬μ©νμ¬ Gram μ μ
type Gram = Brand;
// Kilogram κ°μ μμ±νλ ν¬νΌ ν¨μ
const Kilogram = (value: number) => value as Kilogram;
// Gram κ°μ μμ±νλ ν¬νΌ ν¨μ
const Gram = (value: number) => value as Gram;
const kg: Kilogram = Kilogram(10);
const g: Gram = Gram(10000);
// μ¬μ ν TypeScript μ€λ₯κ° λ°μν©λλ€
// const kg2: Kilogram = g; // 'Gram' νμ
μ 'Kilogram' νμ
μ ν λΉν μ μμ΅λλ€.
console.log(kg, g);
μ΄ μ κ·Όλ²μ ꡬ문μ λ¨μννκ³ λΈλλ©λ νμ μ μΌκ΄μ± μκ² μ μνκΈ° μ½κ² λ§λλλ€.
κ³ κΈ μ¬μ© μ¬λ‘ λ° κ³ λ € μ¬ν
κ°μ²΄ λΈλλ©
Nominal brandingμ μ«μλ λ¬Έμμ΄κ³Ό κ°μ μμ νμ λΏλ§ μλλΌ κ°μ²΄ νμ μλ μ μ©ν μ μμ΅λλ€.
interface User {
id: number;
name: string;
}
const UserIDBrand: unique symbol = Symbol();
type UserID = number & { readonly [UserIDBrand]: true };
interface Product {
id: number;
name: string;
}
const ProductIDBrand: unique symbol = Symbol();
type ProductID = number & { readonly [ProductIDBrand]: true };
// UserIDλ₯Ό κΈ°λνλ ν¨μ
function getUser(id: UserID): User {
// ... IDλ‘ μ¬μ©μλ₯Ό κ°μ Έμ€λ ꡬν
return {id: id, name: "Example User"};
}
const userID = 123 as UserID;
const productID = 456 as ProductID;
const user = getUser(userID);
// μ£Όμμ ν΄μ νλ©΄ μ€λ₯κ° λ°μν©λλ€
// const user2 = getUser(productID); // 'ProductID' νμ
μ μΈμλ 'UserID' νμ
μ λ§€κ°λ³μμ ν λΉν μ μμ΅λλ€.
console.log(user);
μ΄λ `ProductID`μ `UserID`κ° λͺ¨λ κΆκ·Ήμ μΌλ‘ μ«μλ‘ ννλλλΌλ, `UserID`κ° νμν κ³³μ `ProductID`λ₯Ό μ€μλ‘ μ λ¬νλ κ²μ λ°©μ§ν©λλ€.
λΌμ΄λΈλ¬λ¦¬ λ° μΈλΆ νμ κ³Όμ μμ
λΈλλ©λ νμ μ μ 곡νμ§ μλ μΈλΆ λΌμ΄λΈλ¬λ¦¬λ APIμ μμ ν λ, νμ λ¨μΈμ μ¬μ©νμ¬ κΈ°μ‘΄ κ°μΌλ‘λΆν° λΈλλ©λ νμ μ μμ±ν μ μμ΅λλ€. νμ§λ§ μ΄ μμ μ ν λλ μ£Όμν΄μΌ ν©λλ€. μλνλ©΄ λ³Έμ§μ μΌλ‘ ν΄λΉ κ°μ΄ λΈλλ©λ νμ μ λΆν©νλ€κ³ λ¨μΈνλ κ²μ΄λ―λ‘, μ€μ λ‘ κ·Έλ¬νμ§ νμΈν΄μΌ νκΈ° λλ¬Έμ λλ€.
// APIλ‘λΆν° UserIDλ₯Ό λνλ΄λ μ«μλ₯Ό λ°μλ€κ³ κ°μ
const rawUserID = 789; // μΈλΆ μμ€λ‘λΆν° μ¨ μ«μ
// μμ μ«μλ‘λΆν° λΈλλ©λ UserID μμ±
const userIDFromAPI = rawUserID as UserID;
λ°νμ κ³ λ € μ¬ν
TypeScriptμ nominal brandingμ μμ ν μ»΄νμΌ νμ ꡬ쑰물μμ κΈ°μ΅νλ κ²μ΄ μ€μν©λλ€. λΈλλ(κ³ μ μ¬λ³Ό)λ μ»΄νμΌ μ€μ μ§μμ§λ―λ‘ λ°νμ μ€λ²ν€λκ° μμ΅λλ€. νμ§λ§ μ΄λ λν λ°νμ νμ κ²μ¬λ₯Ό μν΄ λΈλλμ μμ‘΄ν μ μμμ μλ―Έν©λλ€. λ°νμ νμ κ²μ¬κ° νμνλ€λ©΄, μ¬μ©μ μ μ νμ κ°λμ κ°μ μΆκ°μ μΈ λ©μ»€λμ¦μ ꡬνν΄μΌ ν©λλ€.
λ°νμ μ ν¨μ± κ²μ¬λ₯Ό μν νμ κ°λ
λΈλλ©λ νμ μ λ°νμ μ ν¨μ± κ²μ¬λ₯Ό μννκΈ° μν΄, μ¬μ©μ μ μ νμ κ°λλ₯Ό λ§λ€ μ μμ΅λλ€:
function isKilogram(value: number): value is Kilogram {
// μ€μ μλ리μ€μμλ μ¬κΈ°μ μΆκ°μ μΈ κ²μ¬λ₯Ό μΆκ°ν μ μμ΅λλ€.
// μλ₯Ό λ€μ΄, κ°μ΄ ν¬λ‘κ·Έλ¨μ μ ν¨ν λ²μ λ΄μ μλμ§ νμΈνλ κ² λ±μ
λλ€.
return typeof value === 'number';
}
const someValue: any = 15;
if (isKilogram(someValue)) {
const kg: Kilogram = someValue;
console.log("κ°μ Kilogramμ
λλ€:", kg);
} else {
console.log("κ°μ Kilogramμ΄ μλλλ€");
}
μ΄λ₯Ό ν΅ν΄ λ°νμμ κ°μ νμ μ μμ νκ² μ’ν μ μμΌλ©°, μ¬μ©νκΈ° μ μ λΈλλ©λ νμ μ λΆν©νλμ§ νμΈν μ μμ΅λλ€.
Nominal Brandingμ μ΄μ
- ν₯μλ νμ μμ μ±: μλνμ§ μμ νμ λ체λ₯Ό λ°©μ§νκ³ λ Όλ¦¬μ μ€λ₯μ μνμ μ€μ λλ€.
- κ°μ λ μ½λ λͺ νμ±: λμΌν κΈ°λ³Έ ννμ κ°μ§ λ€λ₯Έ νμ λ€μ λͺ μμ μΌλ‘ ꡬλ³νμ¬ μ½λλ₯Ό λ μ½κΈ° μ½κ³ μ΄ν΄νκΈ° μ½κ² λ§λλλ€.
- λλ²κΉ μκ° λ¨μΆ: μ»΄νμΌ νμμ νμ κ΄λ ¨ μ€λ₯λ₯Ό μ‘μλ΄μ΄ λλ²κΉ μ€ μκ°κ³Ό λ Έλ ₯μ μ μ½ν©λλ€.
- μ½λ μ λ’°λ μ¦κ°: λ μ격ν νμ μ μ½μ κ°μ ν¨μΌλ‘μ¨ μ½λμ μ νμ±μ λν λ ν° μ λ’°λ₯Ό μ 곡ν©λλ€.
Nominal Brandingμ νκ³
- μ»΄νμΌ νμ μ μ©: λΈλλλ μ»΄νμΌ μ€μ μ§μμ§λ―λ‘ λ°νμ νμ κ²μ¬λ₯Ό μ 곡νμ§ μμ΅λλ€.
- νμ λ¨μΈ νμ: λΈλλ©λ νμ μ λ§λλ λ°λ μ’ μ’ νμ λ¨μΈμ΄ νμνλ©°, μλͺ» μ¬μ©λ κ²½μ° νμ κ²μ¬λ₯Ό μ°νν μ μμ΅λλ€.
- 보μΌλ¬νλ μ΄νΈ μ¦κ°: λΈλλ©λ νμ μ μ μνκ³ μ¬μ©νλ κ²μ μ½λμ μ½κ°μ 보μΌλ¬νλ μ΄νΈλ₯Ό μΆκ°ν μ μμ§λ§, μ λ€λ¦ ν¬νΌ νμ μΌλ‘ μ΄λ₯Ό μνν μ μμ΅λλ€.
Nominal Brands μ¬μ©μ μν λͺ¨λ² μ¬λ‘
- μ λ€λ¦ λΈλλ© μ¬μ©: 보μΌλ¬νλ μ΄νΈλ₯Ό μ€μ΄κ³ μΌκ΄μ±μ 보μ₯νκΈ° μν΄ μ λ€λ¦ ν¬νΌ νμ μ λ§λλλ€.
- νμ κ°λ μ¬μ©: νμν λ λ°νμ μ ν¨μ± κ²μ¬λ₯Ό μν΄ μ¬μ©μ μ μ νμ κ°λλ₯Ό ꡬνν©λλ€.
- λΈλλ μ μ€νκ² μ μ©: nominal brandingμ κ³Όλνκ² μ¬μ©νμ§ λ§μΈμ. λ Όλ¦¬μ μ€λ₯λ₯Ό λ°©μ§νκΈ° μν΄ λ μ격ν νμ κ²μ¬κ° νμν λλ§ μ μ©ν©λλ€.
- λΈλλ λͺ ννκ² λ¬Έμν: κ° λΈλλ©λ νμ μ λͺ©μ κ³Ό μ¬μ©λ²μ λͺ ννκ² λ¬Έμνν©λλ€.
- μ±λ₯ κ³ λ €: λ°νμ λΉμ©μ λ―Έλ―Ένμ§λ§, κ³Όλν μ¬μ©μ μ»΄νμΌ νμμ μ¦κ°μν¬ μ μμ΅λλ€. νμν κ²½μ° νλ‘νμΌλ§νκ³ μ΅μ νν©λλ€.
λ€μν μ°μ λ° μ ν리μΌμ΄μ μμμ μμ
Nominal brandingμ λ€μν λΆμΌμμ μμ©λ©λλ€:
- κΈμ΅ μμ€ν : λ€λ₯Έ ν΅ν(USD, EUR, GBP)μ κ³μ’ μ ν(μκΈ, λΉμ’)μ ꡬλ³νμ¬ μλͺ»λ κ±°λ λ° κ³μ°μ λ°©μ§ν©λλ€. μλ₯Ό λ€μ΄, μν μ ν리μΌμ΄μ μ μ΄μ κ³μ°μ΄ μκΈ κ³μ’μ λν΄μλ§ μνλκ³ λ€λ₯Έ ν΅ν κ° μκΈ μ΄μ²΄ μ ν΅ν λ³νμ΄ μ¬λ°λ₯΄κ² μ μ©λλλ‘ νκΈ° μν΄ nominal νμ μ μ¬μ©ν μ μμ΅λλ€.
- μ μ μκ±°λ νλ«νΌ: μ ν ID, κ³ κ° ID, μ£Όλ¬Έ IDλ₯Ό ꡬλ³νμ¬ λ°μ΄ν° μμ λ° λ³΄μ μ·¨μ½μ μ λ°©μ§ν©λλ€. κ³ κ°μ μ μ©μΉ΄λ μ λ³΄κ° μ€μλ‘ μ νμ ν λΉλλ κ²μ μμν΄ λ³΄μΈμ β nominal νμ μ μ΄λ¬ν μ¬μμ μΈ μ€λ₯λ₯Ό λ°©μ§νλ λ° λμμ΄ λ μ μμ΅λλ€.
- ν¬μ€μΌμ΄ μ ν리μΌμ΄μ : νμ ID, μμ¬ ID, μμ½ IDλ₯Ό λΆλ¦¬νμ¬ μ νν λ°μ΄ν° μ°κ΄μ 보μ₯νκ³ νμ κΈ°λ‘μ μ°λ°μ μΈ νΌν©μ λ°©μ§ν©λλ€. μ΄λ νμ κ°μΈ μ 보 λ³΄νΈ λ° λ°μ΄ν° 무결μ±μ μ μ§νλ λ° λ§€μ° μ€μν©λλ€.
- 곡κΈλ§ κ΄λ¦¬: μ°½κ³ ID, λ°°μ‘ ID, μ ν IDλ₯Ό ꡬλ³νμ¬ μνμ μ ννκ² μΆμ νκ³ λ¬Όλ₯ μ€λ₯λ₯Ό λ°©μ§ν©λλ€. μλ₯Ό λ€μ΄, λ°°μ‘μ΄ μ¬λ°λ₯Έ μ°½κ³ λ‘ μ λ¬λκ³ λ°°μ‘λ μ νμ΄ μ£Όλ¬Έκ³Ό μΌμΉνλμ§ νμΈν©λλ€.
- IoT(μ¬λ¬Ό μΈν°λ·) μμ€ν : μΌμ ID, μ₯μΉ ID, μ¬μ©μ IDλ₯Ό ꡬλ³νμ¬ μ μ ν λ°μ΄ν° μμ§ λ° μ μ΄λ₯Ό 보μ₯ν©λλ€. μ΄λ μ€λ§νΈ ν μλνλ μ°μ μ μ΄ μμ€ν κ³Ό κ°μ΄ 보μκ³Ό μ λ’°μ±μ΄ κ°μ₯ μ€μν μλ리μ€μμ νΉν μ€μν©λλ€.
- κ²μ: 무기 ID, μΊλ¦ν° ID, μμ΄ν IDλ₯Ό ꡬλ³νμ¬ κ²μ λ‘μ§μ κ°ννκ³ μ μ©μ λ°©μ§ν©λλ€. κ°λ¨ν μ€μλ‘ νλ μ΄μ΄κ° NPC μ μ© μμ΄ν μ μ₯μ°©νκ² λμ΄ κ²μ λ°Έλ°μ€λ₯Ό 무λλ¨λ¦΄ μ μμ΅λλ€.
Nominal Brandingμ λμ
Nominal brandingμ κ°λ ₯ν κΈ°λ²μ΄μ§λ§, νΉμ μν©μμλ λ€λ₯Έ μ κ·Όλ²μΌλ‘ λΉμ·ν κ²°κ³Όλ₯Ό μ»μ μ μμ΅λλ€:
- ν΄λμ€: private μμ±μ κ°μ§ ν΄λμ€λ₯Ό μ¬μ©νλ©΄ μ΄λ μ λμ nominal νμ΄νμ μ 곡ν μ μμ΅λλ€. μλνλ©΄ λ€λ₯Έ ν΄λμ€μ μΈμ€ν΄μ€λ λ³Έμ§μ μΌλ‘ ꡬλ³λκΈ° λλ¬Έμ λλ€. νμ§λ§ μ΄ μ κ·Όλ²μ nominal brandingλ³΄λ€ λ μ₯ν©ν μ μμΌλ©° λͺ¨λ κ²½μ°μ μ ν©νμ§ μμ μ μμ΅λλ€.
- Enum: TypeScript enumμ μ¬μ©νλ©΄ νΉμ νκ³ μ νλ κ°λ₯ν κ° μ§ν©μ λν΄ λ°νμμ μ΄λ μ λμ nominal νμ΄νμ μ 곡ν©λλ€.
- 리ν°λ΄ νμ : λ¬Έμμ΄ λλ μ«μ 리ν°λ΄ νμ μ μ¬μ©νλ©΄ λ³μμ κ°λ₯ν κ°μ μ νν μ μμ§λ§, μ΄ μ κ·Όλ²μ nominal brandingκ³Ό κ°μ μμ€μ νμ μμ μ±μ μ 곡νμ§λ μμ΅λλ€.
- μΈλΆ λΌμ΄λΈλ¬λ¦¬: `io-ts`μ κ°μ λΌμ΄λΈλ¬λ¦¬λ λ°νμ νμ κ²μ¬ λ° μ ν¨μ± κ²μ¬ κΈ°λ₯μ μ 곡νμ¬ λ μ격ν νμ μ μ½μ κ°μ νλ λ° μ¬μ©λ μ μμ΅λλ€. νμ§λ§ μ΄λ¬ν λΌμ΄λΈλ¬λ¦¬λ λ°νμ μ’ μμ±μ μΆκ°νλ©° λͺ¨λ κ²½μ°μ νμνμ§ μμ μ μμ΅λλ€.
κ²°λ‘
TypeScript nominal brandingμ λΆν¬λͺ νμ μ μλ₯Ό μμ±νμ¬ νμ μμ μ±μ ν₯μμν€κ³ λ Όλ¦¬μ μ€λ₯λ₯Ό λ°©μ§νλ κ°λ ₯ν λ°©λ²μ μ 곡ν©λλ€. μ΄κ²μ΄ μ§μ ν nominal νμ΄νμ λ체νλ κ²μ μλμ§λ§, TypeScript μ½λμ κ²¬κ³ μ±κ³Ό μ μ§λ³΄μμ±μ ν¬κ² ν₯μμν¬ μ μλ μ€μ©μ μΈ ν΄κ²°μ± μ μ 곡ν©λλ€. nominal brandingμ μ리λ₯Ό μ΄ν΄νκ³ μ μ€νκ² μ μ©ν¨μΌλ‘μ¨, λ μ λ’°ν μ μκ³ μ€λ₯ μλ μ ν리μΌμ΄μ μ μμ±ν μ μμ΅λλ€.
νλ‘μ νΈμμ nominal branding μ¬μ© μ¬λΆλ₯Ό κ²°μ ν λ νμ μμ μ±, μ½λ 볡μ‘μ±, λ°νμ μ€λ²ν€λ κ°μ κ· νμ κ³ λ €νλ κ²μ μμ§ λ§μΈμ.
λͺ¨λ² μ¬λ‘λ₯Ό ν΅ν©νκ³ λμμ μ μ€νκ² κ³ λ €ν¨μΌλ‘μ¨, nominal brandingμ νμ©νμ¬ λ κΉ¨λνκ³ μ μ§λ³΄μνκΈ° μ¬μ°λ©° κ²¬κ³ ν TypeScript μ½λλ₯Ό μμ±ν μ μμ΅λλ€. νμ μμ μ±μ νμ λ°μλ€μ¬ λ λμ μννΈμ¨μ΄λ₯Ό λ§λμΈμ!