Post

타입스크립트 - 타입스크립트 - 제네릭

제네릭

예시1

매개변수에 직접 타입을 지정하기

1
2
3
4
5
6
7
function getArrayLength(arr: number[] | string[] | boolean[]): number {
  return arr.length;
}

getArrayLength([1, 2, 3]);
getArrayLength(["a", "b", "c"]);
getArrayLength([true, false]);

제네릭을 이용해서 매개변수 다양하게 받기
<>사용해서 매개변수의 타입을 할당

1
2
3
4
5
6
7
function getArrayLength1<T>(arr: T[]): number {
  return arr.length;
}

getArrayLength1<number>([1, 2, 3]); // T: number
getArrayLength1<string>(["a", "b", "c"]); // T: string
getArrayLength1<boolean>([true, false]); // T: boolean

예시2

name과 color의 타입은 알지만, option으로 들어오는 값의 타입에 대해 알지 못할 때

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
interface Vehicle {
  name: string;
  color: string;
  option: any;
}

const car = {
  name: "car",
  color: "red",
  option: { price: 1000 }
};
const bike = {
  name: "bike",
  color: "black",
  option: true
};

제네릭 사용하기

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
interface Vehicle1<T> {
  name: string;
  color: string;
  option: T;
}
const car1: Vehicle1<{ price: number }> = {
  name: "car",
  color: "red",
  option: { price: 1000 }
};
const bike1: Vehicle1<boolean> = {
  name: "bike",
  color: "black",
  option: true
};

예시3

매개변수가 2개 이상일 경우

1
2
3
4
5
6
const makeArr = <X, Y>(x: X, y: Y): [X, Y] => {
  return [x, y];
};

const array1 = makeArr<number, number>(4, 5); // X:4, Y: 5
const array2 = makeArr<string, string>("a", "b"); // X:a, Y: b

예시4

매개변수가 여러개일 때 기본 값을 지정할 수도 있음

1
2
3
4
5
6
const makeArr1 = <X, Y = string>(x: X, y: Y): [X, Y] => {
  return [x, y];
};

makeArr1("ab", "cd"); // X:ab, Y: cd
makeArr1<number, number>(1, 2); // X:1, Y: 2

예시5

제네릭과 extends 같이 사용하기

1
2
3
const 함수명 = <T extends 항상 가지고 있어야하는 속성&타입>(arg: T)=>{
  return ...
}

기본 속성인 firstName,lastName외에 age, extedlocation 등의 속성을 받을 수 있음

1
2
3
4
5
6
7
8
9
10
11
const makeFullName1 = <T extends { firstName: string; lastName: string }>(
  obj: T
) => {
  return {
    ...obj,
    fullName: obj.firstName + " " + obj.lastName
  };
};

makeFullName1({ firstName: "Hyemin", lastName: "ko", extedlocation: "Seoul" });
makeFullName1({ firstName: "Hyemin", lastName: "ko", age: 30 });
This post is licensed under CC BY 4.0 by the author.