【问题标题】:TypeScript newable and enum referenceTypeScript newable 和枚举参考
【发布时间】:2018-03-23 08:59:47
【问题描述】:

我正在使用一个用 JavaScript 编写的外部 SDK。其中一个模块Blob 是新的,但也公开了一个枚举FooEnum(成员BarBaz)。

在 JavaScript 中使用这个 SDK 的代码是这样的:

const blobInstance = new Sdk.Blob();
const fooType = Sdk.Blob.FooEnum.Baz;

我现在正在尝试编写一个可以将此 SDK 转换为的接口,以便为我提供一些类型安全性。这是我到目前为止所得到的:

interface BlobInterface { }

enum Foo {
    Bar,
    Baz
}

interface Sdk {
    Blob: {
        new(): BlobInterface;
        FooEnum: Foo;
    }
}

然而,我的问题是,当我引用Blob.FooEnum 时,它认为FooEnum 本身实际上是枚举Foo 的成员(即它认为它是BarBaz)并且,因此,不让我从中得到Baz

我如何告诉 TypeScript Blob.FooEnum 实际上指向枚举本身并且不是枚举的成员?

【问题讨论】:

    标签: javascript typescript types enums typescript-typings


    【解决方案1】:

    Foo 既是值名称又是类型名称。作为一个值,它表示其属性具有键 BarBaz 并且其值分别为 01 的对象(它还具有键为 01 的属性,其值为 @ 987654328@ 和 "Baz",分别。)。作为一个类型,它代表Foo.BarFoo.Baz类型的联合。它们不一样:值Foo 不是Foo 类型。

    这就像在一个类中(例如,class Bar {}),其中值Bar 表示类构造函数,而类型Bar 表示类实例的类型。同样,值Bar 不是Bar 类型。

    在这两种情况下,如果您想要与名称为 FooBar 的值对应的类型,则使用带有值的 typeof

    interface Sdk {
        Blob: {
            FooEnum: typeof Foo;
        }
    }
    

    现在FooEnum 与对象Foo 具有相同的类型,它应该适合你。

    祝你好运!

    【讨论】:

      猜你喜欢
      • 2014-09-10
      • 2015-08-19
      • 2015-08-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多