일단 바로 함수를 예를들어서 알아보자
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
가 있거나 없거나 똑같다.왜 타입에런지 모를때 임시로 에러해결로 사용하거나,
내가 어떤 타입이 들어올지 확실히 알고 있는데 컴파일러 에러가 방해할때
이럴때만 사용하자.