Closed jinsupark4255 closed 2 months ago
윤지님의 말씀에 첨언을 하자면 주어진 코드 패턴은 타입 안전성을 강화하거나 특정 상황에서 타입 에러를 의도적으로 발생시키기 위해 사용될 수 있다고 합니다.
대안적 접근 type DeliveryTip = { tip: number; }
type Filter = Omit<DeliveryTip, 'tip'> & { tip: string; }
const result: Filter = { tip: "5" // 이제 유효합니다. }
type : 유니온, 교차타입 => type 키워드는 이 타입이 어떤 범위를 가진 값이 될거다~
에 가까운 역할을 합니다.
interface : extends
두 키워드의 방식 간 차이는 윤지님 설명이 맞는 것 같고요... 추가적으로 왜 이런식의 타입 재정의를 금지하는지 조금 찾아봤는데 타입간의 호환성과 안정성을 유지하기 위함이라고 합니다. 타입 호환성이라는 것은 extends 가 부모 타입으로 부터 자식 타입을 만들어 내는 것이기 때문에 이런 상속의 일관성 유지 차원에서 방지하고자 하는 것 같습니다.
📝 p.126 - 128
🧐 다음 문제들에 대한 답을 적어주세요.
type과 interface 각각 사용할 수 있는 키워드를 작성해주세요. (extends, 유니온, 교차)
extends와 교차 타입은 비슷해 보여도 100% 상응하지 않을 수 있습니다. 밑에 코드에서 어째서 interface는 컴파일 오류를 발생시킬 수 있고 교차 타입은 컴파일 오류 대신 never 타입이 할당되는지 설명해주세요.
interface Filter extends DeliveryTip { tip: string; // Interface 'Filter' incorrectly extends interface 'DeliveryTip' // Types of property 'tip' are incompatible // Type 'string' is not assignable to type 'number' }