Skip to content

Commit

Permalink
ts 제네릭 분석
Browse files Browse the repository at this point in the history
  • Loading branch information
jihunhong committed Sep 29, 2022
1 parent 08a19c5 commit 3f3759d
Show file tree
Hide file tree
Showing 3 changed files with 52 additions and 1 deletion.
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,6 @@ function pet(a: Cat | Dog) {
}
```

리턴값에 is 가 있다면 커스텀 타입가드 함수라고 생각하자.
리턴값에 is 가 있다면 커스텀 타입가드 함수(형식 조건자)라고 생각하자.

if문안에서 이용하며, 판별과정은 직접 작성한다.
30 changes: 30 additions & 0 deletions TypeScript/22.09.29 forEach, map 제네릭 분석.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
### forEach, map 제네릭 분석

```ts
interface Array<T> {
forEach(callbackfn : (value : T, index: number, array: T[]) => void, thisArg? : any):void;
}

[1, 2, 3].forEach((value) => { console.log(value) });
// callback 함수의 파라미터 value가 number로 추론된다.
['1', '2', '3'].forEach((value) => { console.log(value) });
// value가 string으로 추론된다.
[true, false, true].forEach((value) => { console.log(value) });
// value가 boolean으로 추론된다.
['123', 123, true].forEach((value) => { console.log(value) });
// value가 string | number | boolean 추론된다.

function add<T>(x: T, y: T): T { return x };
// 함수명 뒤에 위치하는 타입 제네릭을 *타입 파라미터*라고 한다

add(1, 2);
add<number>(1, 2);

interface Array<T> {
map<U>(callbackfn : (value : T, index: number, array: T[]) => U, thisArg? : any): U[];
}

const strings = [1, 2, 3].map(item => item.toString());
// strings 는 string[]으로 추론된다.

```
21 changes: 21 additions & 0 deletions TypeScript/22.09.30 filter 제네릭.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
### filter 제네릭

```ts
interface Array<T> {
filter<S extends T>(predicate: (value: T, index: number, array: T[]) => value is S, thisArg?: any): S[];
filter(predicate: (value: T, index: number, array: T[]) => unknown, thisArg?: any): T[];
}

const filtered = [1, 2, 3, 4, 5].filter((value) => value % 2);
// filtered: number[]
const _filtered = ['1', 2, '3', 4, '5'].filter((value) => typeof value === 'string');
// _filter: (string | number)[]
// _filter의 추론을 string[]으로 추론되게 하고싶다면
// interface에 선언되어있는 각각의 filter를 살펴보면 후자는 리턴값의 타입이 T[]로 고정되어있다.
// 이말은 ['1', 2, '3', 4, '5']으로 인해 리턴 타입이 정해지기 때문에 후자의 선언을 따를 수는 없다는것이다.
// 이 점을 통해 첫번째 filter를 이용하는 방법으로 수정하자.
const predicate = (value: string | number): value is string => typeof value === 'string';
// value is string을 이용할 수 있는 이유는 함수 제네릭이 <S extends (string | number)>이기 때문에 가능한것이다.
const result = ['1', 2, '3', 4, '5'].filter(predicate);
// result: string[]
```

0 comments on commit 3f3759d

Please sign in to comment.