programing

TypeScript에서 불투명 유형을 정의하는 방법은 무엇입니까?

newsource 2023. 6. 14. 21:54

TypeScript에서 불투명 유형을 정의하는 방법은 무엇입니까?

내 기억이 맞다면, C++에서 당신은 이런 불투명한 유형을 정의할 수 있습니다...

class Foo;

예를 들어 함수 시그니처를 선언할 때 핸들처럼 사용합니다...

void printFoo(const Foo& foo);

응용 프로그램 코드는 Foo의 실제 정의를 보지 않고 Foo-to-Foo 또는 포인터-to-Foo와 함께 작동할 수 있습니다.

TypeScript에 유사한 것이 있습니까? 불투명한 유형을 어떻게 정의하시겠습니까?

제 문제는 제가 이걸 정의한다면...

interface Foo {};

다른 유사한 유형과 자유롭게 교환할 수 있습니다.관용구가 있습니까?

그것은 TypeScript 유형 시스템이 "구조적"이기 때문에 다음과 같은 새로운 이름을 도입하는 "공칭"과 반대로 동일한 모양을 가진 모든 두 유형이 서로에게 하나씩 할당될 수 있기 때문입니다.Foo같은 모양으로 분해할 수 없게 만들 것입니다.Bar유형 및 그 반대입니다.

TS에 대한 명목형 추가를 추적하는 오래된 문제가 있습니다.

TS에서 불투명 유형에 대한 일반적인 근사치는 고유 태그를 사용하여 두 유형을 구조적으로 다르게 만드는 것입니다.

// opaque type module:
export type EUR = { readonly _tag: 'EUR' };
export function eur(value: number): EUR {
  return value as any;
}
export function addEuros(a: EUR, b: EUR): EUR {
  return ((a as any) + (b as any)) as any;
}

// usage from other modules:
const result: EUR = addEuros(eur(1), eur(10)); // OK
const c = eur(1) + eur(10) // Error: Operator '+' cannot be applied to types 'EUR' and 'EUR'.

더 좋은 것은 태그를 고유한 기호로 인코딩하여 다른 방식으로 액세스하거나 사용하지 않도록 할 수 있다는 것입니다.

declare const tag: unique symbol;
export type EUR = { readonly [tag]: 'EUR' };

이러한 표현은 런타임에 영향을 미치지 않으며, 유일한 오버헤드는 호출하는 것입니다.eur시공자

newtype-ts는 위의 예제와 유사하게 동작하는 유형의 값을 정의하고 사용하기 위한 일반 유틸리티를 제공합니다.

브랜드 유형

또 다른 전형적인 사용 사례는 비할당성을 한 방향으로만 유지하는 것입니다. 즉, 다음을 처리하는 것입니다.EUR할당 가능한 유형number:

declare const a: EUR;
const b: number = a; // OK

이 기능은 이른바 "브랜드 유형"을 통해 얻을 수 있습니다.

declare const tag: unique symbol
export type EUR = number & { readonly [tag]: 'EUR' };

예를 들어 라이브러리에서 이 사용법을 참조하십시오.

언급URL : https://stackoverflow.com/questions/56737033/how-to-define-an-opaque-type-in-typescript