이 코드는 에러가 난다. 왜냐하면 string이 될지도 모를 padding을 1과 더하고 있기 때문이다.
하지만 코드를 이렇게 고치면
에러가 발생하지도 않고 대신 padding의 타입이 number로 좁혀진다.
이렇게 타입스크립트는 자동으로 if/else문, conditional ternaries, loops, truthiness checks, etc 등을 자동으로 판단한다. 그리고 현재 코드에서 typeof padding === "number"와 같은 부분을 type guard라고 한다. 이러한 type guard를 보고 기존의 정의된 타입보다 좀더 구체적인 타입으로 타입을 좁혀서 판단하는 것을 narrowing이라고 한다.
타입스크립트는 narrowing을 위해 다양한 문법들을 살펴본다.
대표적으로 typeof 연산자를 활용한다. 타입스크립트에서 typeof 연산자처럼 특정 블록에서 특정 타입임을 확실히 믿을 수 있게 해주는 존재를 type guard라고 한다. (instanceof 연산자 등도 포함..)
이밖에 다양한 판단 로직이 narrowing을 위해서 활용되는데 그 예시는 이 링크에서 확인하면 좋다.
사용자가 직접 type guard를 설정하는 것도 가능하다.
현재 박스 안의 pet은 파라미터로 들어있는 pet을 의미하고 해당 파라미터에는 Fish 타입의 값이 들어갈 것임을 나타낸 것이다. 즉, isFish 함수에 Fish 타입의 아규먼트를 넘길 지점에서만 isFish 함수를 사용해야 한다는 뜻으로 추측된다.