2017-10-11 233 views
6

我有一个使用JavaScript编写的外部SDK。其中一个模块Blob是新功能,但也暴露了枚举FooEnum(成员BarBaz)。TypeScript newable和枚举参考

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实际上指向枚举本身并且不是枚举的成员?

回答

3

Foo是一个值名称和一个类型名称。作为值,它代表其属性具有键BarBaz和其值01,分别对象(它也有与键01其值分别"Bar""Baz",属性)。作为一种类型,它代表Foo.BarFoo.Baz的类型的联合。这些不一样:值Foo不是Foo类型。

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

在这两种情况下,如果你想对应的名称FooBar值的类型,可以使用typeof与价值:

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

现在FooEnum具有相同类型的对象Foo,和它应该为你工作。

祝你好运!