TypeScript newable和枚举引用

时间:2017-10-11 15:39:25

标签: javascript typescript types enums typescript-typings

我有一个用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的成员(即它认为它是Bar }}或Baz),因此,不允许我从中获取Baz

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

1 个答案:

答案 0 :(得分:3)

Foo既是值名称又是类型名称。作为值,它表示其属性具有键BarBaz且其值分别为01的对象(它还具有键{{1}的属性}和0,其值分别为1"Bar"。)。作为一种类型,它代表"Baz"Foo.Bar类型的联合。这些不一样:值Foo.Baz不是Foo类型。

这类似于类(例如Foo),其中值class Bar {}表示类构造函数,类型Bar表示类的实例类型。同样,值Bar不是Bar类型。

在这两种情况下,如果您想要与名称为BarFoo的值对应的类型,则使用Bar的值为:

typeof

现在interface Sdk { Blob: { FooEnum: typeof Foo; } } 与对象FooEnum具有相同的类型,它应该适合您。

祝你好运!