타입 별칭: ResultTypeFromSelect<TSelectObject>
type ResultTypeFromSelect<TSelectObject> = IsAny<TSelectObject> extends true ? any : WithoutRefBrand<Prettify<{ [K in keyof TSelectObject]: NeedsExtraction<TSelectObject[K]> extends true ? ExtractExpressionType<TSelectObject[K]> : TSelectObject[K] extends ToArrayWrapper<infer T> ? T[] : TSelectObject[K] extends ConcatToArrayWrapper<any> ? string : TSelectObject[K] extends MaterializeWrapper<infer T, infer IsSingle> ? IsSingle extends true ? T | undefined : T[] : TSelectObject[K] extends { __brand: "CaseWhenWrapper"; _result?: infer T } ? ResultTypeFromCaseWhen<T> : (...)[(...)] extends QueryBuilder<(...)> ? Collection<(...)> : (...) extends (...) ? (...) : (...) }>>;
정의 위치: packages/db/src/query/builder/types.ts:403
ResultTypeFromSelect - select 객체에서 결과 타입을 추론합니다
이 복합 타입은 select()에 대한 입력을 쿼리가 반환할 실제 TypeScript
타입으로 변환합니다. select 절에 나타날 수 있는 다양한 값의 종류를
모두 처리합니다:
Ref/RefProxy 추출:
RefProxy<T>→T: 기본 타입을 추출합니다.Ref<T> | undefined→T | undefined: 선택 사항 여부를 보존합니다.Ref<T> | null→T | null: null 허용 여부를 보존합니다.
표현식 타입:
BasicExpression<T>→T:upper()→string과 같은 함수 결과입니다.Aggregate<T>→T:count()→number과 같은 집계 결과입니다.
JavaScript 리터럴 (있는 그대로 전달):
string→string: 문자열 리터럴은 문자열로 유지됩니다.number→number: 숫자 리터럴은 숫자로 유지됩니다.boolean→boolean: 불리언 리터럴은 불리언으로 유지됩니다.null→null: 명시적 null은 null로 유지됩니다.undefined→undefined: 직접적인 undefined 값입니다.
중첩 객체 (재귀적):
- 일반 객체는 중첩된 프로젝션을 처리하도록 재귀적으로 처리됩니다
- RefProxy 객체가 감지되고 해당 타입이 추출됩니다
변환 예:
// Input:
{ id: Ref<number>, name: Ref<string>, status: 'active', count: 42, profile: { bio: Ref<string> } }
// Output:
{ id: number, name: string, status: 'active', count: 42, profile: { bio: string } }
타입 매개변수
TSelectObject
TSelectObject