TS - 동일 이름의 변수와 타입 in d.ts

00_8_3·2023년 5월 13일
0

typescript

목록 보기
7/8

Prisma의 enum

  • prisma.schema
enum Role {
  Admin
  User
}
  • @prisma/client의 index.d.ts
export const Role: {
  Admin: 'Admin',
  User: 'User',
}; // 1번

export type Role = (typeof Role)[keyof typeof Role] // 2번

mysql을 사용한 prisma의 스키마이다.
해당 스키마를 타입스크립트로 생성을 하면
prisma의 d.ts 파일에 위와 같은 이름의 변수와 타입이 생긴다.

Role을 특정 파일에서 import 하면은 변수와 타입을 같이 가져오기 때문에
둘 중 특정한 것을 선택하지 못한다.

원하는 타입 호출하기.

type UnionType = Role // 1
type VarType = typeof Role // 2
  1. UnionType은 "Admin" | "User"의 유니언을 리터럴 타입으로 갖는다.

    type에 선언될 수 있는 것은 타입만

  2. VarType은

 {
    Admin: "Admin";
    User: "User";
}

를 타입으로 갖는다.

typeof는 타입스크립트에서 변수, 객체 또는 값의 타입을 가져오는 연산자이기 때문에
사용하면 위 3개중 하나로 추론한다.

원하는 타입 Pick

그러므로 enum에서 원하는 키값만 뽑아서 사용하려면
2번을 사용하기 위해 typeof 연산자를 사용해야한다.
type Role = Pick<typeof Role, "User">

typeof를 사용하지 않는 경우
type Role = Pick<Role, "User">

Role은 리터럴 유니언 객체로 추론이 되며

프리즈마의 enum의 리터럴 유니언은 string으로 구성되어 있기 때문에
typescript/lib 에서 interface String 타입에서
String의 메서드를 사용하기 때문에

Pick<Role, "User"> 에서 "User" 부분이 기대하던 동작과 다르게
에러가 발생하게 된다.

string의 메소드 이름을 사용하게된다.
예시) type Role = Pick<Role, "replace">
, replace를 정의한 4개 함수 시그니처

참고

0개의 댓글