2017-10-11 238 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,和它應該爲你工作。

祝你好運!