다음과 같은 기능이 있다고 가정하십시오.
function getUserInfo(desiredProperties: ('name' | 'age' | 'salary')[]) {
const userInfo: Record<string, unknown> = {};
for (const propertyName of desiredProperties) {
userInfo[propertyName] = fetchEffortfullyFromDatabase(...);
}
return userInfo;
}
이제 함수를 "보통"이라고 부르면
const userInfo = getUserInfo(['name', 'salary']);
모든 것이 좋습니다. 그러나 어떤 것도 같은 전화를 막지 못합니다.
const userInfo = getUserInfo(['name', 'name', 'name', ...]);
불필요한 데이터베이스 액세스를 많이 유발합니다. 물론 이것은 getUserInfo
런타임에 간단히 처리 할 수 있지만 컴파일러가 이러한 호출을 인식하고 금지하기를 원합니다.
('name' | 'age' | 'salary')[]
propertyNames의 가능한 모든 조합의 조합으로 변경할 수 있습니다 . 즉 ['name'] | ['name', 'age'] | ['name', 'age', 'salary'] | ['age'] | ...
, 세 가지 값에 대해서도 너무 지루하고 더 많은 경우에는 거의 수행 할 수 없습니다 (특히 순서를 고려할 때).
그렇다면 원하는 타이핑을 얻는 다른 방법이 있습니까? 어쩌면 뭔가 AllCombinations<'name', 'age', 'salary'>
?
Set
유형 기능을 사용 하여 전달 된 인수의 고유 한 멤버 만 추출 할 수 있습니다 .
function getUserInfo(desiredProperties: ('name' | 'age' | 'salary')[]) {
const uniqueMembers = new Set(desiredProperties); // this extract only unique members of array
const userInfo: Record<string, unknown> = {};
for (const propertyName of uniqueMembers) { // and here you iterate only through unique members
userInfo[propertyName] = fetchEffortfullyFromDatabase(...);
}
return userInfo;
}
let userInfo = getUserInfo(['name', 'salary']);
userInfo = getUserInfo(['name', 'name', 'name']);
물론 이러한 솔루션은 런타임에 불필요한 계산을 가정하기 때문에 완벽하지 않습니다.
불필요한 계산을 원하지 않는 경우 유형을 desiredProperties
로 설정할 수 있습니다 Set<'name' | 'age' | 'salary'>
. 그리고 다음 getUserInfo
과 같이 전화 하십시오.
const userInfo = getUserInfo(new Set(['name', 'salary']));
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다