2017-10-11 22 views
6

Tôi có một SDK bên ngoài được viết bằng JavaScript mà tôi đang sử dụng. Một trong các mô-đun này, Blob là mới có thể, nhưng cũng hiển thị enum FooEnum (các thành viên BarBaz).TypeScript mới và enum tham khảo

Mã cho sử dụng SDK này trong JavaScript là như vậy:

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

bây giờ tôi đang cố gắng để viết một giao diện mà tôi có thể đúc SDK này để để cung cấp cho tôi một số an toàn loại. Dưới đây là những gì tôi đã có cho đến nay:

interface BlobInterface { } 

enum Foo { 
    Bar, 
    Baz 
} 

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

My vấn đề, tuy nhiên, đó là khi tôi tham khảo Blob.FooEnum, nó nghĩ rằng FooEnum bản thân thực sự là một thành viên của enum Foo (tức là nó tin rằng nó là Bar hoặc Baz) và, do đó, không cho phép tôi nhận được Baz từ đó.

Làm thế nào tôi có thể nói với TypeScript rằng Blob.FooEnum thực sự trỏ đến chính enum và không phải là thành viên của enum?

Trả lời

3

Foo vừa là tên giá trị vừa là tên loại. Là một giá trị, nó đại diện cho đối tượng mà các thuộc tính có phím BarBaz và có giá trị là 01, tương ứng (nó cũng có các tính chất với các phím 01 có giá trị là "Bar""Baz", tương ứng.). Là một loại, nó thể hiện sự kết hợp của các loại Foo.BarFoo.Baz. Các giá trị này không giống nhau: giá trị Foo không thuộc loại Foo.

Điều này giống như trong một lớp học (ví dụ: class Bar {}), trong đó giá trị Bar đại diện cho hàm tạo lớp và loại Bar đại diện cho loại cá thể của lớp. Một lần nữa, giá trị Bar không thuộc loại Bar.

Trong cả hai trường hợp, nếu bạn muốn loại tương ứng với giá trị với tên Foo hoặc Bar, bạn sử dụng typeof với giá trị:

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

Bây giờ FooEnum có kiểu tương tự như đối tượng Foo, và nó sẽ làm việc cho bạn.

Chúc may mắn!

Các vấn đề liên quan