잇창명 개발 블로그 - 검증하지 말고 파싱하라다른 글 들을 보고 참고한 글 입니다.

타입 주도 설계의 본질

가능성의 영역

정적 타입의 좋은 점 하나는 “과연 이런 함수를 작성하는게 가능할까?” 같은 궁금증을 가능하게, 심지어 쉽게 만들어 준다는 겁니다.

극단적인 예로 이 코드를 봅시다.

let foo: never;

과연 foo 의 구현이 가능한가요? 정답은 당연히 : NO! 입니다. 타입이 never 인 값은 존재하지 않으므로 당연히 foo에서 없는 값을 만들어 내지 못합니다. ¹

이 예시는 좀 다르지만 현실적으로 직면한 타입을 들고 오면 더 재미있는 문제가 됩니다.

function head<T>(array: Array<T>): T

//or

function head<T>(array: T[]): T

이 함수는 배열의 첫번째 원소를 반환합니다. 구현할 수 있을까요?

많이 복잡해 보이지 않지만, 실질적으로 구현 하려고 하면 컴파일러는 불만족스러워 합니다. ²

function head<T>(array: Array<T>): T{
	const [first] = array;
	return first;
};
Type 'T | undefined' is not assignable to type 'T'.

메세지를 살펴보면 저 함수가 부분적이다. 즉 가능한 모든 입력에 대해 정의되지 않았다는 걸 알려주고 있습니다. 빈 배열에는 아무것도 들어가 있지 않기 때문에 옳은 말이 됩니다.

이러한 결과를 통해 우리는 이 함수를 안전하게 구현할 수 없다는 사실을 알게 됩니다.

부분함수를 전함수로