
두루두루 모든 타입의 값을 다 적용할 수 있는 범용적인 함수
function func<T>(value: T): T {
return value;
}
let num = func(10);
// number 타입

function func<T>(value: T): T {
return value;
}
let arr = func<[number, number, number]>([1, 2, 3]);
function swap<T, U>(a: T, b: U) {
return [b, a];
}
const [a, b] = swap("1", 2);
function returnFirstValue<T>(data: T[]) {
return data[0];
}
let num = returnFirstValue([0, 1, 2]);
// number
let str = returnFirstValue([1, "hello", "mynameis"]);
// number | string
function returnFirstValue<T>(data: [T, ...unknown[]]) {
return data[0];
}
let str = returnFirstValue([1, "hello", "mynameis"]);
// number
function getLength<T extends { length: number }>(data: T) {
return data.length;
}
getLength("123"); // ✅
getLength([1, 2, 3]); // ✅
getLength({ length: 1 }); // ✅
getLength(undefined); // ❌
getLength(null); // ❌
const arr = [1, 2, 3];
const newArr = arr.map((it) => it * 2);
// [2, 4, 6]
function map<T, U>(arr: T[], callback: (item: T) => U): U[] {
(...)
}
map(arr, (it) => it.toString());
// string[] 타입의 배열을 반환
// 결과 : ["1", "2", "3"]
map(arr, (it) => it * 2);
map(["hi", "hello"], (it) => parseInt(it));
const arr2 = [1, 2, 3];
arr2.forEach((it) => console.log(it));
// 출력 : 1, 2, 3
function forEach<T>(arr: T[], callback: (item: T) => void) {
for (let i = 0; i < arr.length; i++) {
callback(arr[i]);
}
}
interface KeyPair<K, V> {
key: K;
value: V;
}
let keyPair: KeyPair<string, number> = {
key: "key",
value: 0,
};
let keyPair2: KeyPair<boolean, string[]> = {
key: true,
value: ["1"],
};
객체 타입을 유연하게 정의할 수 있도록 돕는 특수한 문법
type CountryCodes = {
[key: string]: string;
};
let countryCodes: CountryCodes = {
Korea: "ko",
UnitedState: "us",
UnitedKingdom: "uk",
// (... 약 100개의 국가)
Brazil : 'bz'
};
interface NumberMap {
[key: string]: number;
}
let numberMap1: NumberMap = {
key: -1231,
key2: 123123,
};
interface Map<V> {
[key: string]: V;
}
let StringMap: Map<string> = {
key: "value",
};
let booleanMap: Map<boolean> = {
key: true,
};
인터페이스와 마찬가지로 타입 별칭에도 제너릭을 적용할 수 있다.
type Map2<V> = {
[key: string]: V;
};
let stringMap2: Map2<string> = {
key: "string",
};