반응형
Notice
Recent Posts
Recent Comments
Link
관리 메뉴

짧은코딩

타입을 만드는 법 본문

TS/TS(with ZeroCho)

타입을 만드는 법

5_hyun 2022. 8. 20. 17:54
반응형

타입 만들기

forEach

-예시1

const a: Arr = [1, 2, 3];
a.forEach((item) => {
  console.log(item);
});
a.forEach((item) => {
  console.log(item);
  return "3";
});

이 코드가 있을 때 Arr 타입을 추론할 수 있어야 한다.

 

interface Arr {
  forEach(callback: (item: number) => void): void;
}

const a: Arr = [1, 2, 3];
a.forEach((item) => {
  console.log(item);
});
a.forEach((item) => {
  console.log(item);
  return "3";
});

forEach 안에 콜백 함수가 있고 리턴하는 것이 없어서 void로 해준다.

 

-예시2

interface Arr {
  forEach(callback: (item: number) => void): void;
}

const b: Arr = ["1", "2", "3"];
b.forEach((item) => {
  console.log(item);
});
b.forEach((item) => {
  console.log(item);
  return "3";
});

이렇게 문자열로 바뀐다면 다시 에러가 난다.

 

interface Arr<T> {
  forEach(callback: (item: T) => void): void;
}

const a: Arr<number> = [1, 2, 3];
a.forEach((item) => {
  console.log(item);
});
a.forEach((item) => {
  console.log(item);
  return "3";
});

const b: Arr<String> = ["1", "2", "3"];
b.forEach((item) => {
  console.log(item);
});
b.forEach((item) => {
  console.log(item);
  return "3";
});

그렇기에 제네릭을 사용해야 한다.

map

-예시1

const a: Arr<number> = [1, 2, 3];
const b = a.map((v) => v + 1);

이 코드의 타입 추론은

interface Arr<T> {
  map(callback: (v: T) => T): T[];
}

매개 변수는 원본 배열의 타입과 같다. 그리고 리턴값은 T의 배열이다.

 

-예시2

interface Arr<T> {
  map<S>(callback: (v: T) => S): S[];
}

const a: Arr<number> = [1, 2, 3];
const c = a.map((v) => v.toString());

이렇게 리턴 타입이 원본 배열과 다를 때는 다른 제네릭을 추가해준다. 

filter

-예시1

const a: Arr<number> = [1, 2, 3];
const b = a.filter((v) => v % 2 === 0);

이 코드의 타입 추론은

interface Arr<T> {
  filter(callback: (v: T) => boolean): T[];
}

이렇게 해야한다.

 

-예시2

interface Arr<T> {
  filter<S extends T>(callback: (v: T) => v is S): S[];
}

const c: Arr<number | string> = [1, "2", 3, "4", 5];
const d = c.filter((v): v is string => typeof v === "string");

이렇게 두 타입이 같이 있는 경우에는 타입 가드를 사용하면 된다.

<S extends T>를 안하면 S와 T가 관련 없다해서 에러가 발생한다. is를 사용하면 타입 범위를 더욱 좁혀준다.

반응형

'TS > TS(with ZeroCho)' 카테고리의 다른 글

TS와 건망증  (0) 2022.08.20
리턴값, 매개변수의 대입 범위  (0) 2022.08.20
제네릭  (0) 2022.08.18
TS 기본 기식(2)  (0) 2022.08.17
TS 기본 지식  (0) 2022.08.11
Comments