인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

wognskec님의 프로필 이미지
wognskec

작성한 질문수

[리뉴얼] 타입스크립트 올인원 : Part1. 기본 문법편

Omit, Exclude, Extract 타입 분석

Omit 타입에서 K extends keyof any에 대해서 질문있습니다.

작성

·

376

1

Omit에서 K extends keyof any로 키값만 들어올 수 있도록 제한을 주었는데

이전 강의때 말씀해주셨던 타입은 정확할수록 좋다는 말씀이 생각나서 질문드립니다.

키 값중에서도 T의 키값이 들어와야 더 정확하다고 생각해서 K extends keyof T 가 더 올바르다고 생각하는데

any로 쓴 이유가 있을까요??

type E<T, U> = T extends U ? never : T;

type P<T, K extends keyof T> = {
  [P in K]: T[P];
};

type O<T, K extends keyof T> = P<T, E<keyof T, K>>;

답변 2

2

저도 해당부분 궁금해서 이거 좀 stric한 Omit이 낫지 않나 생각 해서 찾아보니까 이미 typescript 레포에 이슈가 올라 와있고 microsoft/typescript 오픈소스 개발자에 의해 거절 당한 이슈네요.

 

https://github.com/microsoft/TypeScript/issues/30825

코멘트들이 길어서 그냥 대충 봤는데 typescript 개발자 말로는 strictOmit 같은거 만들어서 커스텀 해서 써라! 인것 같습니다.

아래는 해당 이슈의 microsoft/typescript 개발자의 코멘트를 번역한 내용입니다.

많은 논의 끝에, 우리는 라이브러리가 자체적으로 "더 엄격한" 버전의 생략(및 제외 및 기타 친구)을 제공하는 것이 바람직하다고 생각합니다. 이러한 유형의 엄격한 버전은 업스트림 제약 조건을 강요한다는 측면에서 매우 전염성이 강하며 사람들이 현명하게 선택할지 불분명합니다. 신중하게 관리하지 않으면 실제 마찰을 유발할 수 있습니다.

Omit이 라이브러리에 추가되었기 때문에 더더욱 그러합니다. OmitStrict를 선택하면(물론 여러 정의 중에서 선택할 수 있겠지만) 사용자 공간에 좋은 이름이 별로 남지 않습니다. 이러한 모든 헬퍼 유형을 작성하는 방법에는 몇 가지가 있으며 개발자가 "엄격한"에 대한 자신의 정의에 맞는 유형을 선택하도록 하는 것이 개인의 자유를 극대화할 수 있는 옵션입니다.

여기와 트위터에서 우리가 선택한 (전적으로 방어 가능한 IMO의) 생략 정의에 대한 반응은 그들이 선호하는 정의를 선택하지 않아 약 30~70%의 개발자를 화나게 할 OmitStrict를 선택하는 것에 대해 왜 우리가 별로 좋아하지 않는지를 보여줍니다. 정의가 완전히 모호하지 않은 경우에만 라이브러리에 추가하는 것이 좋은데, OmitStrict는 그 기준에 부합하지 않습니다. 돌이켜보면 Omit도 그렇지 않았고, 어쩌면 그냥 빼버렸어야 했을지도 모릅니다.

개발자 여러분, TS가 그 이름을 짓밟지 않을 거라는 사실을 알고 행복하고 안전하게 OmitStrict에 대한 정의를 선택해 보세요 😬.

오 이거 궁금해서 질문창 열었는데 마침 너무 좋은 답변이 있어서 궁금증 해소하고 갑니다 감사합니다👍

0

제로초(조현영)님의 프로필 이미지
제로초(조현영)
지식공유자

키를 안 쓸 수도 있으니까요.

{ a: 'b', c: 'd', e: 'f' }가 있을 때 Omit<obj, 'a'> 할 수도 있지만 Omit<obj, 'z'> 할 수도 있습니다.

wognskec님의 프로필 이미지
wognskec
질문자

키가 아닌 값이라면 Omit을 쓰는 이유가 없지 않나 의문이 들어서 질문했습니다.

어떤경우에 키가 아닌 값을 Omit에서 쓰는 경우가 있나요??

제로초(조현영)님의 프로필 이미지
제로초(조현영)
지식공유자

쓰는 사람 마음이겠죠..? 뭔 객체든간에 무조건 특정 키가 없어야하는 경우도 있을 수 있고요.

wognskec님의 프로필 이미지
wognskec

작성한 질문수

질문하기