-
Notifications
You must be signed in to change notification settings - Fork 13
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
fix: invert 명확한 타입 추론을 위한 타입 개선 #219
Conversation
|
Codecov ReportAll modified and coverable lines are covered by tests ✅
Additional details and impacted files@@ Coverage Diff @@
## main #219 +/- ##
==========================================
+ Coverage 95.64% 95.66% +0.01%
==========================================
Files 87 87
Lines 872 876 +4
Branches 203 203
==========================================
+ Hits 834 838 +4
Misses 32 32
Partials 6 6
|
export const invert = < | ||
K extends PropertyKey, | ||
V, | ||
TK extends PropertyKey = V extends PropertyKey ? V : PropertyKey | ||
>( | ||
obj: Record<K, V>, | ||
keyTransformer: (value: V) => TK = defaultKeyTransformer<V, TK> |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
TK
는 keyTransformer의 반환 타입입니다.
만약 V
가 PropertyKey의 서브타입이면 TK는 V를 기본 타입으로 갖습니다.
반면에 V가 PropertyKey에 호환되지 않으면 TK는 PropertyKey
를 기본 반환타입으로 갖습니다.
이를 통해 keyTransformer
를 활용해 key가 변환 되더라도 더욱 명확한 타입 추론이 가능하며, keyTransformer
가 참조형을 반환하지 않게 방지 할 수 있습니다.
- 객체의 키는
PropertKey
타입에 호환되는게 자연스럽기 때문에 해당 작업을 통해 훨씬 더 의도에 맞게 타입추론을 할 수 있습니다.
const obj = {
a: { name: 'foo' },
b: { name: 'bar' },
} as const;
const result = invert(obj, (value) => value);
// '{ readonly name: "foo"; } | { readonly name: "bar"; }' 형식은 'PropertyKey' 형식에 할당할 수 없습니다.
const obj = {
a: { name: 'foo' },
b: { name: 'bar' },
} as const;
const result = invert(obj, (value) => value.name);
// { foo: 'a', bar: 'b' }
const invertedObj = {} as Record<TK, Exclude<K, symbol>>; | ||
const keys = Object.keys(obj) as Exclude<K, symbol>[]; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Object.keys
는 symbol을 제외합니다. 따라서 Exclude<K, symbol>[]
를 통해 symbol을 제외하였습니다.
또한, invertedObj
역시 symbol은 제외될 것이기 때문에 Record<TK, Exclude<K, symbol>>
로 정의합니다.
const object1 = {
a: 'somestring',
[Symbol(1)]: true,
};
Object.keys(object1); // ['a']
Overview
invert가 조금 더 명확한 타입을 추론하기 위해 타입을 개선하였습니다.
이제 invert함수가 조금 더 명확한 타입을 추론할 수 있습니다.
Case1
Case2
PR Checklist
Contributing Guide