Skip to content

feat(typecheck): Assert를 tuple-wrap AssertCompat+Expect로 강화 — 시그니처 호환성 진짜 검증#594

Merged
DaveDev42 merged 1 commit into
mainfrom
fix/592-typecheck-signature-gap
Jun 16, 2026
Merged

feat(typecheck): Assert를 tuple-wrap AssertCompat+Expect로 강화 — 시그니처 호환성 진짜 검증#594
DaveDev42 merged 1 commit into
mainfrom
fix/592-typecheck-signature-gap

Conversation

@DaveDev42

Copy link
Copy Markdown
Collaborator

목적

Assert<TMock, TOriginal> = TMock extends TOriginal ? true : never 패턴이 불일치 시 type _X = never를 조용히 허용하는 구조적 허점(#592)을 수정한다.

변경 내용

핵심 유틸 (src/__typecheck-shared.ts)

  • AssertCompat<TMock, TOriginal> — tuple-wrap [TMock] extends [TOriginal] ? true : false로 distributive 단락 방지 + false 반환
  • Expect<T extends true>Tfalse이면 TS2344 컴파일 에러 강제
  • AssertIfPresent<TMockNS, TOrigNS, K> — SDK 라인별 capability-gate (심볼이 해당 SDK 버전에 없으면 skip)

타입체크 마이그레이션

__typecheck.ts / __typecheck-2x.ts 전체의 type _X = Assert<A, B>type _X = Expect<AssertCompat<A, B>>

강화로 발견·수정된 실제 미스매치

도메인 문제 수정
permissions getPermission 등 파라미터 PermissionName 단독이 아닌 { name, access } 객체 mock 시그니처 + 모든 호출 사이트 수정
navigation graniteEvent/tdsEvent 로컬 타입 미러가 SDK 타입과 미묘하게 달랐음 SDK GraniteEvent/TdsEvent 직접 사용
game contactsViral onEvent 타입 너무 넓음 SDK ContactsViralEvent 직접 사용
analytics eventLog log_type 좁은 유니온 SDK 정의 string으로
ads showAppsInTossAdMob 이벤트 시퀀스, FullScreenAd options 정합 SDK 타입 기반 파라미터로 정합
auth getUserKeyForGame SDK 3.0에서 sentinel 제거 항상 { hash, type } 객체 반환

2x 라인 skip (의도된 breaking change)

loadAppsInTossAdMob/showAppsInTossAdMob/FullScreenAd 4개 assertion은 2x SDK의 options? optional + onError: Error vs 3.0의 options required + onError: unknown 차이로 skip 처리 (주석으로 이유 명시).

네거티브 테스트

isMinVersionSupported 반환 타입을 string으로 변경 시 __typecheck.ts(63) TS2344 발생 확인 후 복원. 새 타입 가드가 실제로 동작함을 검증.

검증

  • pnpm typecheck — 4개 tsc invocation 모두 통과
  • pnpm lint — 에러 없음 (info 32개만)
  • pnpm test — 92 파일, 1844 테스트 통과

Closes #592

…성 진짜 검증 (#592)

`Assert<TMock, TOriginal> = TMock extends TOriginal ? true : never` 패턴은
불일치 시 `type _X = never`를 허용해 시그니처 미스매치를 무음으로 통과시켰다.

- `AssertCompat<TMock, TOriginal> = [TMock] extends [TOriginal] ? true : false`
  tuple-wrap으로 distributive 단락 방지 + false 반환
- `Expect<T extends true>` 래퍼로 false → TS2344 컴파일 에러 강제
- `AssertIfPresent<TMockNS, TOrigNS, K>` SDK 라인별 capability-gate
- `__typecheck.ts`/`__typecheck-2x.ts` 전체 마이그레이션

강화 과정에서 발견된 실제 미스매치 수정:
- permissions: `getPermission`/`openPermissionDialog`/`requestPermission`
  파라미터가 `PermissionName` 단독이 아닌 `{ name, access }` 객체임
- navigation: `graniteEvent`/`tdsEvent` SDK `GraniteEvent`/`TdsEvent` 직접 사용
  (로컬 타입 미러 제거)
- game: `contactsViral` `onEvent` 타입을 SDK `ContactsViralEvent` 직접 사용
- analytics: `eventLog` `log_type` 좁은 유니온 → SDK 정의 `string`으로
- ads: `showAppsInTossAdMob` 이벤트 시퀀스 및 `loadFullScreenAd`/`showFullScreenAd`
  options 필드 정합
- auth: `getUserKeyForGame` SDK 3.0에서 sentinel 제거 → 항상 `{ hash, type }` 객체
- 2x 라인: `loadAppsInTossAdMob`/`showAppsInTossAdMob` 4개 assertion skip
  (2.x options optional+onError:Error vs 3.0 options required+onError:unknown 는 의도된 breaking change)

네거티브 테스트: `isMinVersionSupported` 반환 타입을 `string`으로 변경 시
`__typecheck.ts(63)` TS2344 발생 확인 후 복원.
@DaveDev42 DaveDev42 merged commit 79b67a4 into main Jun 16, 2026
2 checks passed
@DaveDev42 DaveDev42 deleted the fix/592-typecheck-signature-gap branch June 16, 2026 11:09
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

__typecheck Assert<>가 존재성만 검증 — 시그니처 불일치는 못 잡음 (tuple-wrap Expect로 강화)

1 participant