Typescript에 해당하는 typedef
나는 내 앱에 다양한 종류의 정수 ID(예: ProductId, UserId 등)를 가지고 있는데, 나는 내가 정확한 ID 타입을 메소드에 전달하는 것을 확신할 수 있도록 강력한 타이핑을 구현하고 싶다.
예를 들어 ProductId 유형의 변수만 전달할 수 있도록 대신 선언하고자 합니다.
C 시절에는 예를 들어, 나는 타이프를 사용했다.
C#에서 나는 int 연산자에 암시적 캐스트와 int 연산자의 명시적 캐스트로 ProductId 클래스를 정의함으로써 이를 달성했다. 타이프보다 번거롭지만 효과는 있다.
나는 TypeScript에서 동등한 것을 하는 방법을 알아내려고 노력하고 있다. TypeScript의 경우 다음을 시도했습니다:
export class ProductId extends Number {}
이를 통해 ProductId 대신 번호를 전달할 수 있습니다.
이것을 타입스크립트로 어떻게 해낼 수 있을까?
TypeScript에서는 그렇게 할 수 없습니다.
별칭을 사용한다고 해서 다른 유형의 값이 전달되지 않습니다. type을 type의 별칭으로 선언하는 경우 type이 예상되는 모든 위치에서 type의 매개 변수를 전달할 수도 있고 그 반대도 가능합니다.
한 가지 유형을 다른 유형으로 캡슐화하는 것은 어떨까요? 타입과 둘 다 타입의 하나의 멤버를 가진다고 가정해보자. 그런 래퍼가 도움이 될까? 아니다. TypeScript의 클래스와 인터페이스의 호환성은 그 구조에 따라 결정된다. 만약 두 종류가 구조를 가지고 있다면 그것들은 호환이 가능하다. 다른 것 대신 하나를 사용하는 것이 가능하다.
어느 정도의 노력으로 이것을 하는 것은 가능하다.
요령은 당신을 숫자와는 다르지만 실제로 자바스크립트로 실행될 때 여전히 숫자로 TS에 있는 것으로 정의하는 것이다.
내 블로그에 이런 글을 적었어요:
하지만 여기서 중요한 내용을 공유하겠습니다:
declare const validProductId: unique symbol;
type ProductId = number & {
[validProductId]: true
}
우리가 '고유의 기호'를 선언했음에도 불구하고, 이것은 자바스크립트에서 완전히 지워져서, 당신의 것에 기호가 추가되어 있지 않아 고통스럽다는 것을 유의하세요.
실제로 로 인식되는 것을 얻으려면 주장 함수, 타입 가드 함수 또는 실제로 생성이 허용된 곳에서 캐스트를 작성해야 합니다.
반복하자면, 실제로 이 기호를 에 추가할 필요는 없습니다. 이것은 타이프스크립트가 와 다른 종류로 인식되도록 하기 위한 것입니다. 실행 중에는 그냥 a입니다.
이것은 당신의 사용 케이스를 위한 패턴입니다. 이는 기본적으로 단순한 숫자가 아니라 비즈니스 논리에 의해 제품 ID로 검증된 숫자라는 것을 나타내는 마커입니다.
'개발하자' 카테고리의 다른 글
ECS Fargate 및 Terraform으로 개인 도커 레지스트리 액세스 (0) | 2023.09.12 |
---|---|
Basic Python calculator (0) | 2023.09.12 |
Svelte 구성 요소를 트리거/강제 업데이트하는 방법 (0) | 2023.09.11 |
젠킨스를 사용하여 kubernetes 배포 업데이트 (0) | 2023.09.09 |
swagger 파일을 기반으로 테라폼이 적용된 api 게이트웨이 배포 (0) | 2023.09.09 |