OSSCA Chromium

기여 목록 / 8500015

Type IndexedDB keyPath instead of any in IndexedDBModel

DevToolsrefactordevtools/devtools-frontendMerged

DevTools Application 패널의 IndexedDBModel.ts에서 jsdoc → TS 마이그레이션 때 any로 남겨둔 keyPath 타입을 실제 타입으로 좁히고, 관련 lint/타입 체크 예외 주석을 제거한 컨트리뷰션입니다.

문제 설명

  • ObjectStore, Index의 keyPath 필드와 생성자 매개변수, keyFromIDBKey() 매개변수가 any로 선언되어 있었음
    • 각 선언마다 // TODO(crbug.com/1172300) + eslint-disable-next-line @typescript-eslint/no-explicit-any가 붙어 있음
  • 올바른 타입은 이미 같은 파일에 있었음
    • idbKeyPathFromKeyPath()의 반환형이자 keyPathStringFromIDBKeyPath()의 매개변수형인 string|string[]|null|undefined
  • ObjectStore.keyPathString 게터에는 @ts-expect-error가 붙어 있었는데, 이게 가리고 있던 건 캐스팅이 아니라 잘못된 반환 타입이었음
    • 게터는 string을 선언했지만 keyPathStringFromIDBKeyPath()는 string|null을 반환

해결 내용

  1. keyPath를 ObjectStore, Index 양쪽에서 string|string[]|null|undefined로 선언
  2. keyFromIDBKey() 매개변수를 IDBValidKey|null|undefined로 선언 (IDBKeyRange.lower/.upper가 넘겨주는 타입)
  3. ObjectStore.keyPathString의 반환형을 string|null로 수정하고 @ts-expect-error 제거
    • 기존 테스트(assert.isNull)와 유일한 호출부(keyPathString !== null)가 이미 nullable로 다루고 있어 동작 변화 없음
  4. 이 저장소 첫 기여라 AUTHORS에 이름·이메일 추가 (같은 CL에 포함)
// before
get keyPathString(): string {
  // TODO(crbug.com/1172300) Ignored during the jsdoc to ts migration)
  // @ts-expect-error
  return IndexedDBModel.keyPathStringFromIDBKeyPath((this.keyPath as string));
}

// after
get keyPathString(): string|null {
  return IndexedDBModel.keyPathStringFromIDBKeyPath(this.keyPath);
}

테스트 방법

  1. 기존 IndexedDBModel 유닛 테스트가 수정 없이 통과 (keyPathString이 null을 반환하는 케이스를 이미 검증)
  2. CQ dry run 및 최종 CQ 통과

배운 점

  • devtools-frontend는 chromium/src와 LUCI 프로젝트가 따로라 dry run 권한도 별개. Gerrit에 CQ Dry Run 버튼이 보여도 CV dry-runner 명단에 없으면 거부되고 투표가 자동 회수됨
  • committer가 아닌 사람의 CL은 승인이 2개 필요해서, 첫 리뷰어가 CLA 확인 후 두 번째 승인자를 직접 불러줌
  • @ts-expect-error를 지울 때는 그게 가리던 게 캐스팅 문제인지 선언 자체의 오류인지부터 확인해야 함

참고 자료