如果我没记错的话,在C++中你可以定义这样一个不透明的类型.
class Foo;..。并将其作为句柄使用,例如在声明函数签名时.
void printFoo(const Foo& foo);然后,应用程序代码可能会使用对Foo的引用或指针到Foo,而不会看到Foo的实际定义。
在TypeScript中是否有类似的东西--您将如何定义不透明类型?
我的问题是如果我定义了这个..。
interface Foo {};..。然后,它可以与其他类似的类型自由互换。有成语吗?
发布于 2019-06-25 08:17:23
这是因为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构造函数。
新型-t提供了通用实用程序,用于定义和使用行为类似于上述示例的类型的值。
品牌类型
另一个典型的用例是只在一个方向上保持不可分配性,即处理可分配给number的number类型。
declare const a: EUR;
const b: number = a; // OK这可以通过所谓的“品牌类型”获得:
declare const tag: unique symbol
export type EUR = number & { readonly [tag]: 'EUR' };例如,请参阅此图书馆。
https://stackoverflow.com/questions/56737033
复制相似问题