我们正在将一些代码从 Closure 类型系统转换为 TypeScript。 之前我们有一些
@enum
和 @typedef
被导出为类的静态成员:
export class C {}
/** @enum {number} */
C.E = {v0: 0, v2: 1, v2: 2};
/** @typedef { ... omitted ... } */
C.T;
TypeScript 似乎不支持将类型声明为类的静态成员(通过类声明中的
static
关键字或通过 enum C.E {…
等语法;相反,似乎是保持向后兼容性的首选方法通过声明合并:
export class C {}
export namespace C {
export enum E = {v0, v1, v2};
export type T: /* omitted */;
}
这按预期工作。
我们希望将此模块从将这些类型导出为类的静态属性转换为单独的命名导出,但要在两个地方过渡地导出它们。 如何才能做到这一点?
对于 typedef,一个简单的
export type T = C.T;
似乎就足够了,但对于枚举来说,似乎可以写:
export type E = C.E;
导出类型但不导出对象(E 在编译的 JavaScript 中将是未定义的),或者
export const E = C.E;
导出对象但不导出类型(E 将被定义,但尝试将其用作类型会产生“'E'引用一个值,但在此处被用作类型”错误)。
此外,如果我们想准备删除静态属性,是否有一些好方法将声明移出合并的命名空间,同时仍然在那里重新导出它们? 即,类似:
export class C {}
export enum E = {v0, v1, v2};
export type T: /* omitted */;
export namespace C {
export type T = /* ??? */; // T = T does not work, for obvious reasons.
export /* ??? */ C = /* ??? */;
}
一种似乎有效但似乎不是最优的解决方案是使用声明合并进行重新导出:
export type E = C.E;
export const E = C.E;