TypeScript μ‘°κ±΄λΆ νμ μ κ°λ ₯ν κΈ°λ₯μ νμ©νμ¬ κ°λ ₯νκ³ μ μ°νλ©° μ μ§ κ΄λ¦¬ κ°λ₯ν APIλ₯Ό ꡬμΆνμΈμ. μ μΈκ³ μννΈμ¨μ΄ νλ‘μ νΈλ₯Ό μν΄ νμ μΆλ‘ μ νμ©νκ³ μ μν μΈν°νμ΄μ€λ₯Ό λ§λμΈμ.
κ³ κΈ API μ€κ³λ₯Ό μν TypeScript μ‘°κ±΄λΆ νμ
μννΈμ¨μ΄ κ°λ° μΈκ³μμ API(Application Programming Interfaces)λ₯Ό ꡬμΆνλ κ²μ κΈ°λ³Έμ μΈ κ΄νμ λλ€. μ μ€κ³λ APIλ νΉν κΈλ‘λ² μ¬μ©μ κΈ°λ°μ λ€λ£° λ λͺ¨λ μ ν리μΌμ΄μ μ μ±κ³΅μ λ§€μ° μ€μν©λλ€. κ°λ ₯ν νμ μμ€ν μ κ°μΆ TypeScriptλ κ°λ°μμκ² κΈ°λ₯μ μΌ λΏλ§ μλλΌ κ°λ ₯νκ³ , μ μ§ κ΄λ¦¬ κ°λ₯νλ©°, μ΄ν΄νκΈ° μ¬μ΄ APIλ₯Ό λ§λ€ μ μλ λꡬλ₯Ό μ 곡ν©λλ€. μ΄λ¬ν λꡬ μ€μμ μ‘°κ±΄λΆ νμ μ κ³ κΈ API μ€κ³λ₯Ό μν ν΅μ¬ μμλ‘ λλλ¬μ§λλ€. μ΄ λΈλ‘κ·Έ κ²μλ¬Όμμλ μ‘°κ±΄λΆ νμ μ 볡μ‘μ±μ μ΄ν΄λ³΄κ³ μ΄λ₯Ό νμ©νμ¬ λμ± μ μμ±μ΄ λ°μ΄λκ³ νμ μμ ν APIλ₯Ό ꡬμΆνλ λ°©λ²μ 보μ¬μ€λλ€.
μ‘°κ±΄λΆ νμ μ΄ν΄
ν΅μ¬μ μΌλ‘ TypeScriptμ μ‘°κ±΄λΆ νμ μ μ¬μ©νλ©΄ λ€λ₯Έ κ°μ νμ μ λ°λΌ λͺ¨μμ΄ λ¬λΌμ§λ νμ μ λ§λ€ μ μμ΅λλ€. μ½λμμ `if...else` λ¬Έμ μ¬μ©νλ λ°©μκ³Ό μ μ¬νκ², νμ μμ€μ λ Όλ¦¬λ₯Ό λμ ν©λλ€. μ΄ μ‘°κ±΄λΆ λ Όλ¦¬λ κ°μ νμ μ΄ λ€λ₯Έ κ° λλ λ§€κ°λ³μμ νΉμ±μ λ°λΌ λ¬λΌμ ΈμΌ νλ 볡μ‘ν μλ리μ€λ₯Ό μ²λ¦¬ν λ νΉν μ μ©ν©λλ€. ꡬ문μ λ§€μ° μ§κ΄μ μ λλ€.
type ResultType = T extends string ? string : number;
μ΄ μμμ `ResultType`μ μ‘°κ±΄λΆ νμ μ λλ€. μ λ€λ¦ νμ `T`κ° `string`μ νμ₯(ν λΉ κ°λ₯)νλ κ²½μ° κ²°κ³Ό νμ μ `string`μ΄κ³ , κ·Έλ μ§ μμ κ²½μ° `number`μ λλ€. μ΄ κ°λ¨ν μλ ν΅μ¬ κ°λ μ 보μ¬μ€λλ€. μ λ ₯ νμ μ λ°λΌ λ€λ₯Έ μΆλ ₯ νμ μ μ»μ΅λλ€.
κΈ°λ³Έ ꡬ문 λ° μμ
ꡬ문μ λ μμΈν μ΄ν΄λ³΄κ² μ΅λλ€.
- 쑰건μ: `T extends string ? string : number`
- νμ λ§€κ°λ³μ: `T` (νκ°λλ νμ )
- 쑰건: `T extends string` (`T`κ° `string`μ ν λΉ κ°λ₯νμ§ νμΈ)
- μ°Έ λΆκΈ°: `string` (μ‘°κ±΄μ΄ μ°ΈμΌ κ²½μ° κ²°κ³Ό νμ )
- κ±°μ§ λΆκΈ°: `number` (μ‘°κ±΄μ΄ κ±°μ§μΌ κ²½μ° κ²°κ³Ό νμ )
μ΄ν΄λ₯Ό λκΈ° μν΄ λͺ κ°μ§ λ λ§μ μμκ° μμ΅λλ€.
type StringOrNumber = T extends string ? string : number;
let a: StringOrNumber = 'hello'; // string
let b: StringOrNumber = 123; // number
μ΄ κ²½μ° μ λ ₯ νμ `T`μ λ°λΌ `string` λλ `number`κ° λλ `StringOrNumber` νμ μ μ μν©λλ€. μ΄ κ°λ¨ν μλ λ€λ₯Έ νμ μ μμ±μ κΈ°λ°μΌλ‘ νμ μ μ μνλ μ‘°κ±΄λΆ νμ μ κ°λ ₯ν¨μ 보μ¬μ€λλ€.
type Flatten = T extends (infer U)[] ? U : T;
let arr1: Flatten = 'hello'; // string
let arr2: Flatten = 123; // number
μ΄ `Flatten` νμ μ λ°°μ΄μμ μμ νμ μ μΆμΆν©λλ€. μ΄ μμμλ 쑰건 λ΄μμ νμ μ μ μνλ λ° μ¬μ©λλ `infer`λ₯Ό μ¬μ©ν©λλ€. `infer U`λ λ°°μ΄μμ νμ `U`λ₯Ό μΆλ‘ νλ©°, `T`κ° λ°°μ΄μΈ κ²½μ° κ²°κ³Ό νμ μ `U`μ λλ€.
API μ€κ³μ κ³ κΈ μ ν리μΌμ΄μ
μ‘°κ±΄λΆ νμ μ μ μ°νκ³ νμ μμ ν APIλ₯Ό λ§λλ λ° λ§€μ° μ€μν©λλ€. λ€μν κΈ°μ€μ λ°λΌ μ μνλ νμ μ μ μν μ μμ΅λλ€. λͺ κ°μ§ μ€μ©μ μΈ μ ν리μΌμ΄μ μ λ€μκ³Ό κ°μ΅λλ€.
1. λμ μλ΅ νμ μμ±
μμ² λ§€κ°λ³μμ λ°λΌ λ€λ₯Έ λ°μ΄ν°λ₯Ό λ°ννλ κ°μ APIλ₯Ό μκ°ν΄ 보μΈμ. μ‘°κ±΄λΆ νμ μ μ¬μ©νλ©΄ μλ΅ νμ μ λμ μΌλ‘ λͺ¨λΈλ§ν μ μμ΅λλ€.
interface User {
id: number;
name: string;
email: string;
}
interface Product {
id: number;
name: string;
price: number;
}
type ApiResponse =
T extends 'user' ? User : Product;
function fetchData(type: T): ApiResponse {
if (type === 'user') {
return { id: 1, name: 'John Doe', email: 'john.doe@example.com' } as ApiResponse; // TypeScript knows this is a User
} else {
return { id: 1, name: 'Widget', price: 19.99 } as ApiResponse; // TypeScript knows this is a Product
}
}
const userData = fetchData('user'); // userData is of type User
const productData = fetchData('product'); // productData is of type Product
μ΄ μμμ `ApiResponse` νμ μ μ λ ₯ λ§€κ°λ³μ `T`μ λ°λΌ λμ μΌλ‘ λ³κ²½λ©λλ€. TypeScriptκ° `type` λ§€κ°λ³μλ₯Ό κΈ°λ°μΌλ‘ λ°νλ λ°μ΄ν°μ μ νν ꡬ쑰λ₯Ό μκΈ° λλ¬Έμ μ΄λ νμ μμ μ±μ ν₯μμν΅λλ€. μ΄λ κ² νλ©΄ μ λμ¨ νμ κ³Ό κ°μ νμ μμ μ±μ΄ λ¨μ΄μ§ μ μλ λμμ μ¬μ©ν νμκ° μμ΅λλ€.
2. νμ μμ ν μ€λ₯ μ²λ¦¬ ꡬν
APIλ μμ² μ±κ³΅ μ¬λΆμ λ°λΌ λ€λ₯Έ μλ΅ λͺ¨μμ λ°ννλ κ²½μ°κ° λ§μ΅λλ€. μ‘°κ±΄λΆ νμ μ μ΄λ¬ν μλ리μ€λ₯Ό μ°μνκ² λͺ¨λΈλ§ν μ μμ΅λλ€.
interface SuccessResponse {
status: 'success';
data: T;
}
interface ErrorResponse {
status: 'error';
message: string;
}
type ApiResult = T extends any ? SuccessResponse | ErrorResponse : never;
function processData(data: T, success: boolean): ApiResult {
if (success) {
return { status: 'success', data } as ApiResult;
} else {
return { status: 'error', message: 'An error occurred' } as ApiResult;
}
}
const result1 = processData({ name: 'Test', value: 123 }, true); // SuccessResponse<{ name: string; value: number; }>
const result2 = processData({ name: 'Test', value: 123 }, false); // ErrorResponse
μ¬κΈ°μ `ApiResult`λ `SuccessResponse` λλ `ErrorResponse`κ° λ μ μλ API μλ΅μ ꡬ쑰λ₯Ό μ μν©λλ€. `processData` ν¨μλ `success` λ§€κ°λ³μμ λ°λΌ μ¬λ°λ₯Έ μλ΅ νμ μ΄ λ°νλλλ‘ ν©λλ€.
3. μ μ°ν ν¨μ μ€λ²λ‘λ μμ±
μ‘°κ±΄λΆ νμ μ ν¨μ μ€λ²λ‘λμ ν¨κ» μ¬μ©νμ¬ κ³ λλ‘ μ μ κ°λ₯ν APIλ₯Ό λ§λ€ μλ μμ΅λλ€. ν¨μ μ€λ²λ‘λλ₯Ό μ¬μ©νλ©΄ ν¨μκ° λ§€κ°λ³μ νμ κ³Ό λ°ν νμ μ΄ λ€λ₯Έ μ¬λ¬ μλͺ μ κ°μ§ μ μμ΅λλ€. λ€μν μμ€μμ λ°μ΄ν°λ₯Ό κ°μ Έμ¬ μ μλ APIλ₯Ό μκ°ν΄ 보μΈμ.
function fetchDataOverload(resource: T): Promise;
function fetchDataOverload(resource: string): Promise;
async function fetchDataOverload(resource: string): Promise {
if (resource === 'users') {
// Simulate fetching users from an API
return new Promise((resolve) => {
setTimeout(() => resolve([{ id: 1, name: 'User 1', email: 'user1@example.com' }]), 100);
});
} else if (resource === 'products') {
// Simulate fetching products from an API
return new Promise((resolve) => {
setTimeout(() => resolve([{ id: 1, name: 'Product 1', price: 10.00 }]), 100);
});
} else {
// Handle other resources or errors
return new Promise((resolve) => {
setTimeout(() => resolve([]), 100);
});
}
}
(async () => {
const users = await fetchDataOverload('users'); // users is of type User[]
const products = await fetchDataOverload('products'); // products is of type Product[]
console.log(users[0].name); // Access user properties safely
console.log(products[0].name); // Access product properties safely
})();
μ¬κΈ°μ 첫 λ²μ§Έ μ€λ²λ‘λλ `resource`κ° 'users'μΈ κ²½μ° λ°ν νμ μ΄ `User[]`μμ μ§μ ν©λλ€. λ λ²μ§Έ μ€λ²λ‘λλ 리μμ€κ° 'products'μΈ κ²½μ° λ°ν νμ μ΄ `Product[]`μμ μ§μ ν©λλ€. μ΄ μ€μ μ ν΅ν΄ ν¨μμ μ 곡λ μ λ ₯μ λ°λΌ λ³΄λ€ μ νν νμ κ²μ¬κ° κ°λ₯νλ©°, μ΄λ μ½λ μμ± λ° μ€λ₯ κ°μ§λ₯Ό κ°μ ν©λλ€.
4. μ νΈλ¦¬ν° νμ μμ±
μ‘°κ±΄λΆ νμ μ κΈ°μ‘΄ νμ μ λ³ννλ μ νΈλ¦¬ν° νμ μ ꡬμΆνκΈ° μν κ°λ ₯ν λꡬμ λλ€. μ΄λ¬ν μ νΈλ¦¬ν° νμ μ λ°μ΄ν° ꡬ쑰λ₯Ό μ‘°μνκ³ APIμμ λ μ¬μ¬μ© κ°λ₯ν κ΅¬μ± μμλ₯Ό λ§λλ λ° μ μ©ν μ μμ΅λλ€.
interface Person {
name: string;
age: number;
address: {
street: string;
city: string;
country: string;
};
}
type DeepReadonly = {
readonly [K in keyof T]: T[K] extends object ? DeepReadonly : T[K];
};
const readonlyPerson: DeepReadonly = {
name: 'John',
age: 30,
address: {
street: '123 Main St',
city: 'Anytown',
country: 'USA',
},
};
// readonlyPerson.name = 'Jane'; // Error: Cannot assign to 'name' because it is a read-only property.
// readonlyPerson.address.street = '456 Oak Ave'; // Error: Cannot assign to 'street' because it is a read-only property.
μ΄ `DeepReadonly` νμ μ κ°μ²΄μ μ€μ²©λ κ°μ²΄μ λͺ¨λ μμ±μ μ½κΈ° μ μ©μΌλ‘ λ§λλλ€. μ΄ μλ μ‘°κ±΄λΆ νμ μ μ¬κ·μ μΌλ‘ μ¬μ©νμ¬ λ³΅μ‘ν νμ λ³νμ λ§λλ λ°©λ²μ 보μ¬μ€λλ€. μ΄λ λΆλ³ λ°μ΄ν°κ° μ νΈλλ μλ리μ€, νΉν λμ νλ‘κ·Έλλ°μ΄λ μ¬λ¬ λͺ¨λ κ°μ λ°μ΄ν°λ₯Ό 곡μ ν λ λ§€μ° μ€μνλ©° μΆκ°μ μΈ μμ μ±μ μ 곡ν©λλ€.
5. API μλ΅ λ°μ΄ν° μΆμν
μ€μ API μνΈ μμ©μμ λνλ μλ΅ κ΅¬μ‘°λ‘ μμ νλ κ²½μ°κ° λ§μ΅λλ€. μ‘°κ±΄λΆ νμ μ λ€μν μλ΅ λνΌλ₯Ό μ²λ¦¬νλ κ²μ κ°μνν μ μμ΅λλ€.
interface ApiResponseWrapper {
data: T;
meta: {
total: number;
page: number;
};
}
type UnwrapApiResponse = T extends ApiResponseWrapper ? U : T;
function processApiResponse(response: ApiResponseWrapper): UnwrapApiResponse {
return response.data;
}
interface ProductApiData {
name: string;
price: number;
}
const productResponse: ApiResponseWrapper = {
data: {
name: 'Example Product',
price: 20,
},
meta: {
total: 1,
page: 1,
},
};
const unwrappedProduct = processApiResponse(productResponse); // unwrappedProduct is of type ProductApiData
μ΄ μμμ `UnwrapApiResponse`λ `ApiResponseWrapper`μμ λ΄λΆ `data` νμ μ μΆμΆν©λλ€. μ΄λ₯Ό ν΅ν΄ API μλΉμλ νμ λνΌλ₯Ό μ²λ¦¬νμ§ μκ³ λ ν΅μ¬ λ°μ΄ν° κ΅¬μ‘°λ‘ μμ ν μ μμ΅λλ€. μ΄λ API μλ΅μ μΌκ΄λκ² μ‘°μ νλ λ° λ§€μ° μ μ©ν©λλ€.
μ‘°κ±΄λΆ νμ μ¬μ©μ μν λͺ¨λ² μ¬λ‘
μ‘°κ±΄λΆ νμ μ κ°λ ₯νμ§λ§ λΆμ μ νκ² μ¬μ©νλ©΄ μ½λκ° λ 볡μ‘ν΄μ§ μλ μμ΅λλ€. μ‘°κ±΄λΆ νμ μ ν¨κ³Όμ μΌλ‘ νμ©νκΈ° μν λͺ κ°μ§ λͺ¨λ² μ¬λ‘λ λ€μκ³Ό κ°μ΅λλ€.
- κ°λ¨νκ² μ μ§νμΈμ: κ°λ¨ν μ‘°κ±΄λΆ νμ λΆν° μμνμ¬ νμμ λ°λΌ μ μ§μ μΌλ‘ 볡μ‘μ±μ μΆκ°νμΈμ. μ§λμΉκ² 볡μ‘ν μ‘°κ±΄λΆ νμ μ μ΄ν΄νκ³ λλ²κΉ νκΈ° μ΄λ €μΈ μ μμ΅λλ€.
- μ€λͺ μ μΈ μ΄λ¦ μ¬μ©: μ΄ν΄νκΈ° μ½λλ‘ μ‘°κ±΄λΆ νμ μ λͺ ννκ³ μ€λͺ μ μΈ μ΄λ¦μ μ§μ νμΈμ. μλ₯Ό λ€μ΄ `SR` λμ `SuccessResponse`λ₯Ό μ¬μ©νμΈμ.
- μ λ€λ¦κ³Ό κ²°ν©: μ‘°κ±΄λΆ νμ μ μ λ€λ¦κ³Ό ν¨κ» μ¬μ©ν λ κ°μ₯ μ μλνλ κ²½μ°κ° λ§μ΅λλ€. μ΄λ₯Ό ν΅ν΄ κ³ λλ‘ μ μ°νκ³ μ¬μ¬μ© κ°λ₯ν νμ μ μλ₯Ό λ§λ€ μ μμ΅λλ€.
- νμ λ¬Έμν: JSDoc λλ κΈ°ν λ¬Έμν λꡬλ₯Ό μ¬μ©νμ¬ μ‘°κ±΄λΆ νμ μ λͺ©μ κ³Ό λμμ μ€λͺ νμΈμ. νΉν ν νκ²½μμ μμ ν λ μ€μν©λλ€.
- μ² μ ν ν μ€νΈ: ν¬κ΄μ μΈ λ¨μ ν μ€νΈλ₯Ό μμ±νμ¬ μ‘°κ±΄λΆ νμ μ΄ μμλλ‘ μλνλμ§ νμΈνμΈμ. μ΄λ κ² νλ©΄ κ°λ° μ£ΌκΈ° μ΄κΈ°μ μ μ¬μ μΈ νμ μ€λ₯λ₯Ό ν¬μ°©νλ λ° λμμ΄ λ©λλ€.
- κ³Όλν μμ§λμ΄λ§ λ°©μ§: κ°λ¨ν μ루μ (μ: μ λμ¨ νμ )μΌλ‘ μΆ©λΆν κ²½μ° μ‘°κ±΄λΆ νμ μ μ¬μ©νμ§ λ§μΈμ. λͺ©νλ μ½λλ₯Ό λ μ½κΈ° μ½κ³ μ μ§ κ΄λ¦¬ κ°λ₯νκ² λ§λλ κ²μ΄μ§ λ 볡μ‘νκ² λ§λλ κ²μ΄ μλλλ€.
μ€μ μμ λ° κΈλ‘λ² κ³ λ € μ¬ν
νΉν κΈλ‘λ² λμμ μν APIλ₯Ό μ€κ³ν λ μ‘°κ±΄λΆ νμ μ΄ λΉμ λ°νλ μ€μ μλ리μ€λ₯Ό μ΄ν΄λ³΄κ² μ΅λλ€.
- κ΅μ ν λ° μ§μν: μ§μνλ λ°μ΄ν°λ₯Ό λ°νν΄μΌ νλ APIλ₯Ό μκ°ν΄ 보μΈμ. μ‘°κ±΄λΆ νμ
μ μ¬μ©νλ©΄ λ‘μΌμΌ λ§€κ°λ³μλ₯Ό κΈ°λ°μΌλ‘ μ‘°μ λλ νμ
μ μ μν μ μμ΅λλ€.
μ΄ μ€κ³λ μνΈ μ°κ²°λ μΈκ³μμ μ€μν λ€μν μΈμ΄μ μꡬ μ¬νμ μΆ©μ‘±ν©λλ€.
type LocalizedData= L extends 'en' ? T : (L extends 'fr' ? FrenchTranslation : GermanTranslation ); - ν΅ν λ° νμ μ§μ : κΈμ΅ λ°μ΄ν°λ₯Ό μ²λ¦¬νλ APIλ μ‘°κ±΄λΆ νμ
μ μ¬μ©νμ¬ μ¬μ©μμ μμΉ λλ μ νΈνλ ν΅νλ₯Ό κΈ°λ°μΌλ‘ ν΅νλ₯Ό νμ μ§μ ν μ μμ΅λλ€.
μ΄ μ κ·Ό λ°©μμ λ€μν ν΅νμ μ«μ ννμ λ¬Ένμ μ°¨μ΄(μ: μΌν λλ λ§μΉ¨νλ₯Ό μμ κ΅¬λΆ κΈ°νΈλ‘ μ¬μ©)λ₯Ό μ§μν©λλ€.
type FormattedPrice= C extends 'USD' ? string : (C extends 'EUR' ? string : string); - μκ°λ μ²λ¦¬: μκ° λ―Όκ°ν λ°μ΄ν°λ₯Ό μ 곡νλ APIλ μ‘°κ±΄λΆ νμ μ νμ©νμ¬ μ¬μ©μμ μκ°λμ λ§κ² νμμ€ν¬νλ₯Ό μ‘°μ νμ¬ μ§λ¦¬μ μμΉμ κ΄κ³μμ΄ μνν κ²½νμ μ 곡ν μ μμ΅λλ€.
μ΄λ¬ν μλ κΈλ‘λ²νλ₯Ό ν¨κ³Όμ μΌλ‘ κ΄λ¦¬νκ³ κ΅μ μ μΈ μ²μ€μ λ€μν μꡬ μ¬νμ μΆ©μ‘±νλ APIλ₯Ό λ§λλ λ° μμ΄ μ‘°κ±΄λΆ νμ μ λ€μ¬λ€λ₯ν¨μ κ°μ‘°ν©λλ€. κΈλ‘λ² μ²μ€μ μν APIλ₯Ό ꡬμΆν λ μκ°λ, ν΅ν, λ μ§ νμ λ° μΈμ΄ μ€μ μ κ³ λ €νλ κ²μ΄ μ€μν©λλ€. μ‘°κ±΄λΆ νμ μ μ¬μ©ν¨μΌλ‘μ¨ κ°λ°μλ μμΉμ κ΄κ³μμ΄ λ°μ΄λ μ¬μ©μ κ²½νμ μ 곡νλ μ μν νμ μμ APIλ₯Ό λ§λ€ μ μμ΅λλ€.
ν¨μ λ° μ΄λ₯Ό λ°©μ§νλ λ°©λ²
μ‘°κ±΄λΆ νμ μ λ§€μ° μ μ©νμ§λ§ νΌν΄μΌ ν μ μ¬μ μΈ ν¨μ μ΄ μμ΅λλ€.
- 볡μ‘μ± μ¦κ°: κ³Όλν μ¬μ©μ μ½λλ₯Ό μ½κΈ° μ΄λ ΅κ² λ§λ€ μ μμ΅λλ€. νμ μμ μ±κ³Ό κ°λ μ± κ°μ κ· νμ μ μ§νμμμ€. μ‘°κ±΄λΆ νμ μ΄ μ§λμΉκ² 볡μ‘ν΄μ§λ©΄ λ μκ³ κ΄λ¦¬νκΈ° μ¬μ΄ λΆλΆμΌλ‘ 리ν©ν°λ§νκ±°λ λ체 μ루μ μ νμνλ κ²μ κ³ λ €νμμμ€.
- μ±λ₯ κ³ λ € μ¬ν: μΌλ°μ μΌλ‘ ν¨μ¨μ μ΄μ§λ§ λ§€μ° λ³΅μ‘ν μ‘°κ±΄λΆ νμ μ μ»΄νμΌ μκ°μ μν₯μ λ―ΈμΉ μ μμ΅λλ€. μ΄λ μΌλ°μ μΌλ‘ μ£Όμ λ¬Έμ λ μλμ§λ§ νΉν λκ·λͺ¨ νλ‘μ νΈμμ μΌλμ λμ΄μΌ ν μ¬νμ λλ€.
- λλ²κΉ μ΄λ €μ: 볡μ‘ν νμ μ μλ λλλ‘ λͺ¨νΈν μ€λ₯ λ©μμ§λ‘ μ΄μ΄μ§ μ μμ΅λλ€. TypeScript μΈμ΄ μλ² λ° IDEμ νμ κ²μ¬μ κ°μ λꡬλ₯Ό μ¬μ©νμ¬ μ΄λ¬ν λ¬Έμ λ₯Ό μ μνκ² μλ³νκ³ μ΄ν΄νμμμ€.
κ²°λ‘
TypeScript μ‘°κ±΄λΆ νμ μ κ³ κΈ APIλ₯Ό μ€κ³νκΈ° μν κ°λ ₯ν λ©μ»€λμ¦μ μ 곡ν©λλ€. μ΄λ₯Ό ν΅ν΄ κ°λ°μλ μ μ°νκ³ νμ μμ νλ©° μ μ§ κ΄λ¦¬ κ°λ₯ν μ½λλ₯Ό λ§λ€ μ μμ΅λλ€. μ‘°κ±΄λΆ νμ μ λ§μ€ν°ν¨μΌλ‘μ¨ νλ‘μ νΈμ λ³ννλ μꡬ μ¬νμ μ½κ² μ μνλ APIλ₯Ό ꡬμΆνμ¬ κΈλ‘λ² μννΈμ¨μ΄ κ°λ° νκ²½μμ κ°λ ₯νκ³ νμ₯ κ°λ₯ν μ ν리μΌμ΄μ μ ꡬμΆνκΈ° μν μ΄μμΌλ‘ λ§λ€ μ μμ΅λλ€. μ‘°κ±΄λΆ νμ μ κ°λ ₯ν κΈ°λ₯μ νμ©νκ³ API λμμΈμ νμ§κ³Ό μ μ§ κ΄λ¦¬ κ°λ₯μ±μ λμ¬ μνΈ μ°κ²°λ μΈκ³μμ νλ‘μ νΈλ₯Ό μ₯κΈ°μ μΈ μ±κ³΅μΌλ‘ μ΄λμμμ€. μ΄λ¬ν κ°λ ₯ν λꡬμ μ μ¬λ ₯μ μ΅λν νμ©νλ €λ©΄ κ°λ μ±, λ¬Έμν λ° μ² μ ν ν μ€νΈλ₯Ό μ°μ μνμμμ€.