如何在 TypeScript 中正确地为 `enum` 类型(及其对象)起别名?

问题描述 投票:0回答:2

我们正在将一些代码从 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 = /* ??? */;
}
typescript types enums
2个回答
2
投票

一种似乎有效但似乎不是最优的解决方案是使用声明合并进行重新导出:

export type E = C.E;
export const E = C.E;

0
投票

还可以使用特殊的别名导入从命名空间导入枚举;

import { C } from './c';
import E = C.E;

参考:TypeScript:文档 - 命名空间

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.