是否可以在TypeScript中的类中定义类型(字符串文字联合)?

时间:2016-04-03 06:29:29

标签: types typescript typescript1.8

在TypeScript 1.8中,他们添加了一个名为"字符串文字类型的新类型"它允许您声明一个只能是一组有限值之一的类型。他们给出的例子是:

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

但是,在他们的所有示例中,类型都是在类的外部定义的,或者在没有别名的情况下内联定义。正如this question的答案中所解释的那样(相当简洁),类型别名声明的范围限定在它们的包含模块中。

在我的项目中,我想为字符串文字定义类型别名,这些字符串文字与特定类配对并在多个地方使用。由于我正在使用的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";

1 个答案:

答案 0 :(得分:1)

您无法直接在类中定义类型(无论它们是嵌套类,枚举还是字符串文字类型)。

但是,如this answer所示,您可以通过在同名模块中定义嵌套类型来解决这个问题。

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