본문으로 건너뛰기

타입 별칭: 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> | undefinedT | undefined: 선택 사항 여부를 보존합니다.
  • Ref<T> | nullT | null: null 허용 여부를 보존합니다.

표현식 타입:

  • BasicExpression<T>T: upper()string과 같은 함수 결과입니다.
  • Aggregate<T>T: count()number과 같은 집계 결과입니다.

JavaScript 리터럴 (있는 그대로 전달):

  • stringstring: 문자열 리터럴은 문자열로 유지됩니다.
  • numbernumber: 숫자 리터럴은 숫자로 유지됩니다.
  • booleanboolean: 불리언 리터럴은 불리언으로 유지됩니다.
  • nullnull: 명시적 null은 null로 유지됩니다.
  • undefinedundefined: 직접적인 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