TypeScript newable 和枚举参考

Posted

技术标签:

【中文标题】TypeScript newable 和枚举参考【英文标题】:TypeScript newable and enum reference 【发布时间】:2018-03-23 08:59:47 【问题描述】:

我正在使用一个用 javascript 编写的外部 SDK。其中一个模块Blob 是新的,但也公开了一个枚举FooEnum(成员BarBaz)。

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

【问题讨论】:

【参考方案1】:

Foo 既是值名称又是类型名称。作为一个值,它表示其属性具有键 BarBaz 并且其值分别为 01 的对象(它还具有键为 01 的属性,其值为 @ 987654328@ 和 "Baz",分别。)。作为一个类型,它代表Foo.BarFoo.Baz类型的联合。它们不一样:值Foo 不是Foo 类型。

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

在这两种情况下,如果您想要与名称为 FooBar 的值对应的类型,则使用带有值的 typeof

interface Sdk 
    Blob: 
        FooEnum: typeof Foo;
    

现在FooEnum 与对象Foo 具有相同的类型,它应该适合你。

祝你好运!

【讨论】:

以上是关于TypeScript newable 和枚举参考的主要内容,如果未能解决你的问题,请参考以下文章

使用对象字面量作为 TypeScript 枚举值

TypeScript入门七:TypeScript的枚举

遍历枚举、TypeScript 和 JQuery

LayaBox---TypeScript---枚举

12.typescript-枚举

具有值和显示名称的typescript枚举