在TypeScript中,是否可以在类内定义一种类型(字符串字面联合)?

26

在 TypeScript 1.8 中,他们添加了一种称为“字符串字面量类型”的新类型,它允许您声明一种只能是有限值集合中的一种类型。他们给出的示例是:

type Easing = "ease-in" | "ease-out" | "ease-in-out";

然而,在他们的所有示例中,类型要么是在其所使用的类之外定义的,要么是内联定义而没有别名。正如此问题的答案中(相当简洁地)解释的那样,类型别名声明是限定于它们所在的模块的。

在我的项目中,我想为与特定类配对并在多个位置使用的字符串文字定义类型别名。由于我正在使用的API的结构,有多个类都具有相同名称但不同潜在值的属性。如果可能的话,我想保持我的代码整洁,而不是有一堆带有前缀的全局类型声明(MyClassAPropertyValueMyClassBPropertyValue等)。

因此,是否有任何方法可以在类作用域内声明一个type(最好是可以从外部模块使用)? 如果没有,是否有接近替代方案或计划的功能可以满足这个用例?


用例:

假设我有两个包装底层API数据的类。每个类表示不同的数据,只是它们恰好具有一些相同名称的属性。我希望以以下方式定义属性:

export class APIObjectA {
    // Valid values in APIObjectA
    public type Property1Value = "possible_value_A" | "possible_value_B";
    public type Property2Value = "possible_value_C" | "possible_value_D";

    // Here, "Property1Value" refers to the version in APIObjectA
    public get property1(): Property1Value {
        // Return value of property1 from underlying API data
    }

    public get property2(): Property2Value {
        // ...
    }
}

export class APIObjectB {
    // Valid values in APIObjectB
    public type Property1Value = "possible_value_E" | "possible_value_F";
    public type Property2Value = "possible_value_G" | "possible_value_H";

    // In this context, "Property1Value" refers to the version in APIObjectB
    public get property1(): Property1Value {
        // ...
    }

    public get property2(): Property2Value {
        // ...
    }
}

然后,理想情况下,我希望在消费代码中能够引用特定类型,以便我在任何地方都有类型:

var myNewValue: APIObjectB.Property1Value = "possible_value_F";

我认为我理解你的问题,但你能否添加一些代码作为你打算如何使用这种类型的示例? - reduckted
1个回答

20

在一个类内部,你不能直接定义类型(包括嵌套类、枚举或字符串字面量类型)。

但是,正如 这个答案 所示,你可以通过在同名模块中定义嵌套类型来实现。

export class APIObjectA {
    // Here, "Property1Value" refers to the version in APIObjectA
    public get property1(): APIObjectA.Property1Value {
        // Return value of property1 from underlying API data
    }

    public get property2(): APIObjectA.Property2Value {
        // ...
    }
}

module APIObjectA {
    // Valid values in APIObjectA
    export type Property1Value = "possible_value_A" | "possible_value_B";
    export type Property2Value = "possible_value_C" | "possible_value_D";
}

export class APIObjectB {
    // In this context, "Property1Value" refers to the version in APIObjectB
    public get property1(): APIObjectB.Property1Value {
        // ...
    }

    public get property2(): APIObjectB.Property2Value {
        // ...
    }
}

module APIObjectB {
    // Valid values in APIObjectB
    export type Property1Value = "possible_value_E" | "possible_value_F";
    export type Property2Value = "possible_value_G" | "possible_value_H";
}

请注意,在属性的返回类型中需要使用完全限定名。例如,您需要使用APIObjectB.Property1Value而不是仅使用Property1Value


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接