📖 참고한 페이지
책 92p에는 이런 문장이 나옵니다.
T[]는 readonly T[]에 비해서 확실히 더 많은 기능을 가지므로 T[]는 readonly T[]의 서브타입이라고 할 수 있습니다
저는 처음에 "readonly T[]는 읽기만 되니까 더 제한적이고, T[]가 더 넓은 슈퍼타입 아닌가?"라고 생각했습니다.
이름에서 풍기는 뉘앙스로 readonly를 마치 "제약"처럼 받아들이다 보니 집합 관점에서 봤을 때 혼동이 생겼던 것 같습니다.
(처음 생각: "읽기"만 가능하니까 더 제한적이다!)
결과적으로 책에서는 readonly T[]를 더 넓은 슈퍼타입으로, T[]를 서브타입으로 설명하는데요.
"서브타입과 슈퍼타입을 무엇을 기준으로 나누는가"를 readonly 관점까지 포함하여 정리해보면 좋을 것 같습니다.
❓ 질문 / 문제
[질문]
다음 코드 중 하나는 통과하고 하나는 에러가 납니다. 각각 왜 그럴까요?
const a: number[] = [1, 2, 3];
const b: readonly number[] = a; // ?
const c: number[] = b; // ?
[심화]
아래 두 인터페이스에서는 Dog가 Animal의 서브타입입니다.
프로퍼티가 더 많은 쪽이 서브타입이 되는 셈인데요.
interface Animal { name: string }
interface Dog { name: string; bark(): void }
위 배열 예시와 이 예시를 하나의 기준으로 함께 설명할 수 있을까요?
집합 관점에서 슈퍼 vs 서브 타입을 판별하는 기준을 본인만의 언어로 정리해 볼 수 있다면 좋을 것 같습니다.
📖 참고한 페이지
책 92p에는 이런 문장이 나옵니다.
저는 처음에 "readonly T[]는 읽기만 되니까 더 제한적이고, T[]가 더 넓은 슈퍼타입 아닌가?"라고 생각했습니다.
이름에서 풍기는 뉘앙스로 readonly를 마치 "제약"처럼 받아들이다 보니 집합 관점에서 봤을 때 혼동이 생겼던 것 같습니다.
(처음 생각: "읽기"만 가능하니까 더 제한적이다!)
결과적으로 책에서는 readonly T[]를 더 넓은 슈퍼타입으로, T[]를 서브타입으로 설명하는데요.
"서브타입과 슈퍼타입을 무엇을 기준으로 나누는가"를 readonly 관점까지 포함하여 정리해보면 좋을 것 같습니다.
❓ 질문 / 문제
[질문]
다음 코드 중 하나는 통과하고 하나는 에러가 납니다. 각각 왜 그럴까요?
[심화]
아래 두 인터페이스에서는 Dog가 Animal의 서브타입입니다.
프로퍼티가 더 많은 쪽이 서브타입이 되는 셈인데요.
위 배열 예시와 이 예시를 하나의 기준으로 함께 설명할 수 있을까요?
집합 관점에서 슈퍼 vs 서브 타입을 판별하는 기준을 본인만의 언어로 정리해 볼 수 있다면 좋을 것 같습니다.