function checkNull(arg: number | null): number {
if (arg == null) throw new Error('앗 널이다!!');
return arg;
}
null을 체크하는 함수이다. 파라미터로 number 혹은 null 타입을 받고 있다.
리턴도 넘버타입이다.
그럼 string은? boolean은? 혹은 내가 만든 타입이라면???
function checkNull(arg: any | null): any {
if (arg == null) throw new Error('앗 널이다!!');
return arg;
}
any타입으로 만들어보았다. 리턴도 any타입이다.
이제 문제가 없다. 재사용성이 향상됐으니까.
function checkNull(arg: any | null): any {
if (arg == null) throw new Error('앗 널이다!!');
return arg + '1';
}
const num = checkNull(10);
num은 number타입일까? string타입일까?
답은 그냥 any이다. 콘솔로 출력하면 '101'이다.
그렇다. any로 만들면 타입이 보장되지않는다.
제네릭이 필요하다.
function checkNull<T>(arg: T | null): T {
if (arg == null) throw new Error('앗 널이다!!');
return arg;
}
함수명 옆에 <>를 추가하고 <>안과 parameter type, return type에 T라는 type을 넣었다.
T에는 뭘 넣어도 상관없지만 대문자 알파벳 하나를 넣는 것이 관례이다.
타입추론을 통해 number 타입이 보장되는 것을 확인할 수 있다.
Class Generic
interface Either<L, R> {
left: () => L;
right: () => R;
}
class SimpleEither<L, R> implements Either<L, R> {
constructor(private leftValue: L, private rightValue: R) {}
left(): L {
return this.leftValue;
}
right(): R {
return this.rightValue;
}
}
const either: Either<number, number> = new SimpleEither(4, 5);
either.left(); // 4
either.right(); // 5
실용성은 없지만 제네릭 클래스를 이해하기에 좋은 예제이다.
'개발언어 > TypeScript' 카테고리의 다른 글
유틸리티 타입 (Utility Types) (0) | 2021.04.16 |
---|---|
type과 interface 차이 (0) | 2021.04.16 |
타입스크립트의 객체지향 (0) | 2021.04.15 |
타입 단언 (Type Assertions) (0) | 2021.04.12 |
타입 추론 (Type Inference) (0) | 2021.04.12 |
댓글