TypeScript newable和枚举引用

Jam*_*ger 6 javascript enums types typescript typescript-typings

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

在JavaScript中使用此SDK的代码如下:

const blobInstance = new Sdk.Blob();
const fooType = Sdk.Blob.FooEnum.Baz;
Run Code Online (Sandbox Code Playgroud)

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

interface BlobInterface { }

enum Foo {
    Bar,
    Baz
}

interface Sdk {
    Blob: {
        new(): BlobInterface;
        FooEnum: Foo;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

jca*_*alz 3

Foo既是值名称又是类型名称。作为值,它表示属性具有键Bar和的对象Baz,其值分别为01(它也具有具有键的属性01其值分别为"Bar""Baz"。)。Foo.Bar作为一种类型,它表示和类型的并集Foo.Baz。它们是不一样的:值Foo不是类型Foo

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

Foo在这两种情况下,如果您想要与名称为或 的值相对应的类型,请与值一起Bar使用:typeof

interface Sdk {
    Blob: {
        FooEnum: typeof Foo;
    }
}
Run Code Online (Sandbox Code Playgroud)

现在FooEnum与 object 具有相同的类型Foo,它应该适合您。

祝你好运!