2017-10-11 53 views
6

Mam zewnętrzny SDK napisany w JavaScript, którego używam. Jeden z tych modułów, Blob, jest nowy, ale również udostępnia enum FooEnum (członkowie Bar i Baz).Notatka TypeScript nierozliczona i wyliczeniowa

Kod do korzystania z tego SDK w JavaScript jest tak:

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

Jestem teraz próbuje napisać interfejs, który mogę rzucić ten SDK, aby dać mi trochę typu bezpieczeństwa. Oto co mam do tej pory:

interface BlobInterface { } 

enum Foo { 
    Bar, 
    Baz 
} 

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

Moim problemem jest jednak to, że kiedy odwołać Blob.FooEnum, to myśli, że sama FooEnum jest rzeczywiście członkiem wyliczenia Foo (tj uważa, że ​​jest Bar lub Baz) i dlatego nie pozwala mi uzyskać z niego Baz.

Jak mogę powiedzieć TypeScript, że Blob.FooEnum rzeczywiście wskazuje na samo wyliczenie i nie jest członkiem wyliczenia?

Odpowiedz

3

Foo jest zarówno nazwą wartości, jak i nazwą typu. Jako wartość, to oznacza obiekt, którego właściwości mają klucze Bar i Baz i którego wartości 0 i 1, odpowiednio (to wykazuje również za pomocą klawiszy 0 i 1 których wartości "Bar" i "Baz", odpowiednio.). Jako typ reprezentuje połączenie typów Foo.Bar i Foo.Baz. Nie są one takie same: wartość Foo nie jest typu Foo.

To jak w klasie (np class Bar {}), przy czym wartość Bar oznacza konstruktora klasy i typ Bar reprezentuje typ instancji klasy. Ponownie, wartość Bar nie jest typu Bar.

W obu przypadkach, jeśli chcesz typ odpowiadającej wartości z nazwą Foo lub Bar, należy użyć typeof o wartości:

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

Teraz FooEnum ma taki sam typ jak obiekt Foo i to powinno działać dla ciebie.

Powodzenia!