2016-04-03 24 views
3

在TypeScript 1.8中,他们添加了一个名为“字符串文字类型”的新类型,它允许您声明只能是一组有限值之一的类型。即:使实例是:是否可以在TypeScript中的类中定义类型(字符串文字联合)?

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

但是,在其所有的实施例中,类型为定义外,它是在使用或不使用内联的别名定义的类。正如this question的答案中所解释的(相当简单),类型别名声明的作用域限定为它们的包含模块。

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

那么,有没有什么办法可以在类范围内声明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"; 
+0

我想我明白你在问什么,但是你可以添加一些代码作为你打算如何使用这种类型的例子吗? – reduckted

回答

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

相关问题