기여 목록 / 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을 반환
- 게터는
해결 내용
keyPath를ObjectStore,Index양쪽에서string|string[]|null|undefined로 선언keyFromIDBKey()매개변수를IDBValidKey|null|undefined로 선언 (IDBKeyRange.lower/.upper가 넘겨주는 타입)ObjectStore.keyPathString의 반환형을string|null로 수정하고@ts-expect-error제거- 기존 테스트(
assert.isNull)와 유일한 호출부(keyPathString !== null)가 이미 nullable로 다루고 있어 동작 변화 없음
- 기존 테스트(
- 이 저장소 첫 기여라
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);
}테스트 방법
- 기존
IndexedDBModel유닛 테스트가 수정 없이 통과 (keyPathString이null을 반환하는 케이스를 이미 검증) - 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를 지울 때는 그게 가리던 게 캐스팅 문제인지 선언 자체의 오류인지부터 확인해야 함