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
'programing' 카테고리의 다른 글
Git가 새 하위 모듈을 시작/동기화/업데이트하지 않음 (0) | 2023.06.19 |
---|---|
여러 기준과 특정 순서를 가진 특정 열에 의한 구별되는 행 (0) | 2023.06.14 |
문자열에서 문자 인스턴스 바꾸기 (0) | 2023.06.14 |
왜 클랑은 "||" 안에 "&"이라고 경고합니까? (0) | 2023.06.14 |
문서의 전체 텍스트 범위를 가져오기 위한 VS 코드 확장 API? (0) | 2023.06.14 |