일단 바로 함수를 예를들어서 알아보자
function sum(x :number | string){
return x + 1 //err
}
이런 함수에서는 union으로 타입이 확실하지 않아서 연산이 안되는데
이럴 때는 타입을 확정해야만 한다.
if문 같은거로 타입을 하나로 지정하는 건데
위에 함수로 해보면
function sum(x :number | string){
if (typeof x === 'number') {
return x + 1
}
else if (typeof x === 'string') {
return x + 1
}
else {
return 0
}
}
if문에서 typeof키워드로 타입을 검사해서 각 타입을 확실하게 한 다음 각 연산을 따로해야한다.
ts에서는 귀찮더라고 이렇게 해야한다.
마지막에 else가 없으면 에러가 나는데
리턴하지 않는 조건문이 있으면 나중에 버그가 생길 수 있어서 에러를 준다.
typeof말고도 in이나 instanceof키워드 같은거로 사용해도 된다. 확정할 수 있으면 그건 Narrowing역할을 하는 것이다.
타입을 간편하게 assert할 수 있다.
변수명 as string이런식으로 사용하면 된다.
또 맨위 친구를 써보면
function sum(x :number | string){
return (x as number) + 1 //err
}
여기서 as를 사용하면
이변수는 number이라고 확실하게 정하는건데
ts의 컴파일러에게 주장한다고 보면된다.
함수에 무조건 숫자가 들어온다는 것이 확실해야 쓸 수 있는 문법이다.
as는 union type 같은 복잡한 타입을 정확한 하나의 타입으로 줄이는 역할이다.as가 있거나 없거나 똑같다.왜 타입에런지 모를때 임시로 에러해결로 사용하거나,
내가 어떤 타입이 들어올지 확실히 알고 있는데 컴파일러 에러가 방해할때
이럴때만 사용하자.