타입스크립트 satisfies 는 as 와 차이
2 minute read
2024-07-09
아래와 같은 타입이 있다고 하자. name 과 age 모두 Union 타입이다.
type User = {
name: number | string;
age: number | string;
}방금 선언한 타입으로 객체를 생성 시 타입 단언 으로 지정해준다. 의도한 대로 타입 에러가 뜨지 않는다.
const user: User = {
name: 'minsu kim',
age: 20,
} // 혹은 as User타입 에러
이제 user 객체를 핸들링 하려고 했는데 문제가 발생했다.
const lastName = user.name.split(' ')[1] // Error!
age.toFixed(1); // Error!위에서는 문제가 없었는데 왜 메소드를 사용할 때는 에러가 뜨는 걸까?
원인
문제의 원인은 유니온과 타입 단언이 만날 때 발생한다.
user 객체를 초기화할 때 유니온 타입에 부합해서 에러가 뜨지 않았지만, name 과 age 를 각각 알맞는 타입으로 추론되지 않았기 때문에 발생했다.
user.name // string | number
user.age // string | number초기화할 때 유니온 중 하나의 타입을 넣었지만, 범위가 축소되지 않았다.
유니온 타입이 있을 때 객체의 타입을 알맞게 추론하기 위해서는 satisfies 키워드를 통해 해결할 수 있다.
해결
아래와 같이 Object Literal 에 satisfies 를 붙여서 타입 체크도 하면서 추론 가능하도록 해준다.
const user = {
name: 'minsu kim',
age: 20,
} satisfies User;다시 코드를 보면 에러가 사라진 걸 볼 수 있고, 알맞게 타입 추론이 된 것을 확인할 수 있다.
user.name // string
user.age // number