-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
3 changed files
with
52 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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[]으로 추론된다. | ||
|
||
``` |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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[] | ||
``` |