首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在TypeScript中定义不透明类型?

如何在TypeScript中定义不透明类型?
EN

Stack Overflow用户
提问于 2019-06-24 12:52:40
回答 1查看 8.7K关注 0票数 26

如果我没记错的话,在C++中你可以定义这样一个不透明的类型.

代码语言:javascript
复制
class Foo;

..。并将其作为句柄使用,例如在声明函数签名时.

代码语言:javascript
复制
void printFoo(const Foo& foo);

然后,应用程序代码可能会使用对Foo的引用或指针到Foo,而不会看到Foo的实际定义。

在TypeScript中是否有类似的东西--您将如何定义不透明类型?

我的问题是如果我定义了这个..。

代码语言:javascript
复制
interface Foo {};

..。然后,它可以与其他类似的类型自由互换。有成语吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-06-25 08:17:23

这是因为TypeScript类型系统是“结构化的”,因此任何两种具有相同形状的类型都可以相互分配--而不是“名义”,在这种情况下,引入像Foo这样的新名称将使其不能分配到相同形状的Bar类型,反之亦然。

这里有一个长期存在的问题跟踪标准的输入添加到TS。

TS中不透明类型的一个常见近似方法是使用唯一标记使任何两种类型在结构上不同:

代码语言:javascript
复制
// 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'.

更好的是,可以使用唯一的符号对标记进行编码,以确保它永远不会被访问并以其他方式使用:

代码语言:javascript
复制
declare const tag: unique symbol;
export type EUR = { readonly [tag]: 'EUR' };

请注意,这些表示在运行时没有任何影响,唯一的开销是调用eur构造函数。

新型-t提供了通用实用程序,用于定义和使用行为类似于上述示例的类型的值。

品牌类型

另一个典型的用例是只在一个方向上保持不可分配性,即处理可分配给numbernumber类型。

代码语言:javascript
复制
declare const a: EUR;
const b: number = a; // OK

这可以通过所谓的“品牌类型”获得:

代码语言:javascript
复制
declare const tag: unique symbol
export type EUR = number & { readonly [tag]: 'EUR' };

例如,请参阅此图书馆。

票数 37
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56737033

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档