我有一个用JavaScript编写的外部SDK,我正在使用它。其中一个模块Blob
是新功能的,但也会公开枚举FooEnum
(成员Bar
和Baz
)。
在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
的成员(即它认为它是Bar
}}或Baz
),因此,不允许我从中获取Baz
。
我如何告诉TypeScript Blob.FooEnum
实际指向枚举本身并且不是枚举的成员?
答案 0 :(得分:3)
Foo
既是值名称又是类型名称。作为值,它表示其属性具有键Bar
和Baz
且其值分别为0
和1
的对象(它还具有键{{1}的属性}和0
,其值分别为1
和"Bar"
。)。作为一种类型,它代表"Baz"
和Foo.Bar
类型的联合。这些不一样:值Foo.Baz
不是Foo
类型。
这类似于类(例如Foo
),其中值class Bar {}
表示类构造函数,类型Bar
表示类的实例类型。同样,值Bar
不是Bar
类型。
在这两种情况下,如果您想要与名称为Bar
或Foo
的值对应的类型,则使用Bar
的值为:
typeof
现在interface Sdk {
Blob: {
FooEnum: typeof Foo;
}
}
与对象FooEnum
具有相同的类型,它应该适合您。