const v1 = {
	x: 1,
	y: 2,
}

const v2 = {
	x: 1 as const,
	y: 2,
}

const v3 = {
	x: 1,
	y: 2,
} as const

[재희] v2에서 x 프로퍼티를 as const로 지정하는 것과 v3에서 as const로 readonly화 된 x는 어떤 차이가 있을까요?

[지윤] 속성 하나만 하고 싶으면 속성 하나에만 as const, 전체에 하고 싶으면 객체에 as const를 하면 되지 않을까요?

[재희] 그건 그런데, 추론이 v2에서는 x: 1 , v3에서는 readonly x: 1 이 되니까 다르지 않을까요?

[지윤] 외부로부터 값이 추가되지 않는다고 확정되는 상황일 때 readonly를 사용하면 되지 않을까요?

[재희] v2에서는 객체에서 요소 추가 삭제가 자유롭고 v3에서는 아니다 ~ 인가요?

[지윤] 흠…

[진욱] v2에서는 x를 1로 재할당은 가능한데, v3에서는 아예 재할당이 안되지 않을까요?

[재희] 그러면 x만 두고 보면 똑같은가요?

[진욱] x가 1인 것은 같고, 재할당이 안되는 건 v3에서이고 v2에서는 되겠죠?

[재희] 그러네요, v2에서 x는 같은 1로 재할당이 되고, 그 외에 값은 객체 전체 대상으로 오류를 보여주네요. v3에서는 1로 재할당 해도 안되고, 다른 값도 다 안되네요. 그리고 그 프로퍼티 대상으로만 에러 메세지가 나타나네요. 더 얘기해봐도 좋을 것 같아요.

// 6. 타입 가드(is)
// bad -> undefined가 걸러지지 않았다.
const jackson5 = ['Jackie', 'Tito', 'Jermaine', 'Marion', 'Michael'];
const members = ['Janet', 'Michael']
  .map(who => jackson5.find(n => n === who))
  .filter(who => who !== undefined); // 타입이 (string|undefined)[]

//good
function isDefined<T>(x: T | undefined): x is T{
  return x !== undefined;
}
const members = ['Janet', 'Michael']
  .map(who => jackson5.find(n => n === who))
  .filter(isDefined); // 타입이 string[]

[지윤] 이 내용 설명해주실 분 있나요?

[동호] undefined를 걸러내는 내용인데, TS에서 안 걸러진다는 것 같아요.

[지윤] 왜 안걸러지죠?

[재희] 런타임에서는 걸러져요.

[진욱] undefined가 어디서 왔는지 생각해보면 될 것 같아요.