개발자

readonly 키워드가 붙을 경우, 그렇지 않는 타입보다, 슈퍼타입이 되는 이유는 무엇일까요? 제가 제대로 이해하고 있는걸까요?

2024년 04월 01일조회 38

안녕하세요, 타입에 readonly 키워드가 붙을 경우, readonly가 붙은 타입이 슈퍼타입이 된다 이해하고 있습니다. 그 이유가, readonly를 붙은 타입은 그렇지 않은 타입보다 가능한 기능이 적습니다 즉, 타입을 이루는 요소의 갯수가 적습니다. 요소의 갯수가 적으면 슈퍼타입이 됩니다. 요소의 갯수가 적으면, 적은 갯수를 만족하는 집합 갯수가 많기 때문에, 타입이 크다라고 할 수 있고, 요소의 갯수가 많은 경우, 이 많은 갯수를 만족하는 집합의 갯수(경우의수)를 찾기 어렵기?때문에 이것은 타입이 작고, 서브타입이라고 이해하고 있습니다. 반면, ChatGPT를 통해 위의 내용을 검색해보면, readonly 키워드가 붙은 타입이 좁다 라고 합니다(서브타입이라고 합니다) (제가 이해한것으로는 타입이 슈퍼타입이 된다라고 이해하고 있는데요,,,) 그 이유는 readonly는 읽기전용이라, 타입이 좁다고 합니다.. 코에 걸면 코걸이, 귀에 걸면 귀걸이, 이걸 보면 이게 맞는거 같고, 저걸 보면 저게 맞는거 같고, 혼란스럽네요 혹시 이 질문에 대해서 명확하게 답변 해주실 분 있을까요? 참고로, 이와 관련해 '이펙티브 타입스크립트'교재의 내용을 첨부합니다. 이펙티브 책에서는 number[] 타입이, readonly number[]보다 기능이 많기 때문에, 서브타입이라고 합니다 number[]: 서브타입, readonly number[] : 슈퍼타입 readonly가 붙은 곳이 슈퍼타입이 된다 라는 공식이 있는듯 보이는데요,, 공식말고, 어떤 원리이길래 공식?처럼 보이는것일까요?

1let a:readonly string[] = ['love','typescript']
2let b:string[] = ['love','react']
3
4a = b; // readonly a = b
5b = a // Error, b = readonly a
6
7//The type 'readonly string[]' is 'readonly' and cannot be assigned to the mutable type 'string[]'.
이 질문이 도움이 되었나요?
'추천해요' 버튼을 누르면 좋은 질문이 더 많은 사람에게 노출될 수 있어요. '보충이 필요해요' 버튼을 누르면 질문자에게 질문 내용 보충을 요청하는 알림이 가요.

답변 0

답변이 없을 때 보이는 아이콘

첫 답변을 기다리고 있어요.

지금 가입하면 모든 질문의 답변을 볼 수 있어요!

현직자들의 명쾌한 답변을 얻을 수 있어요.

또는

이미 회원이신가요?

AI 답변
커리어리 AI 봇 프로필 이미지

커리어리 AI 봇

GPT가 달아주는 답변입니다.

2024년 04월 01일

다음의 이유로 인해 `readonly` 키워드가 붙은 타입이 슈퍼타입이 됩니다: 1. **불변성 속성**: `readonly`를 사용하는 타입은 불변성을 갖습니다. 이는 해당 데이터 형식이 한 번 선언된 후에는 수정되지 못한다는 것을 의미합니다. 반면, `readonly` 없이 선언된 변수/객체(가변 타입)는 변경이 가능합니다. 따라서, 불변 타입(readonly)은 가변 타입의 모든 특성을 포함하고 있지만, 그 반대는 아니므로 슈퍼타입이 됩니다. 2. **데이터 안전성**: 불변 데이터 유형(`readonly`)은 코드와 프로그램 경로 전체에서 안정적입니다. 이는 데이터가 예상하지 못한 수정으로부터 보호되기 때문입니다. 즉, `readonly`를 사용하면 안전하게 코드를 작성할 수 있으며, 이런 의미에서 슈퍼타입으로 볼 수 있습니다. 위의 정보들로 가시적인 예시를 남겨봅시다. ```typescript let a: readonly number[] = [1, 2, 3]; // "a" is a supertype because it's read-only let b: number[] = [4, 5, 6]; // "b" is a subtype because it's mutable b = a; // This is acceptable because mutable arrays (subtype) can be assigned to read-only arrays (supertype) a = b; // But this will raise a TypeScript error, as we're trying to assign a mutable array (which might change in the future) to a read-only array ``` 위의 코드에서 보시는 것처럼 `readonly` 배열은 변경 가능한 배열에 할당될 수 있지만, 그 반대는 허용되지 않습니다. 이 상황에서 `readonly number[]`는 `number[]` 타입의 슈퍼타입으로 간주됩니다. 이제 여러분은 왜 `readonly` 타입이 슈퍼타입이라고 간주되는지를 이해하셨을 것입니다.

목록으로

지금 가입하면 모든 질문의 답변을 볼 수 있어요!