Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是否可以在TypeScript中的类中定义类型(字符串文字联合)?_Types_Typescript_Typescript1.8 - Fatal编程技术网

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

是否可以在TypeScript中的类中定义类型(字符串文字联合)?,types,typescript,typescript1.8,Types,Typescript,Typescript1.8,在TypeScript 1.8中,他们添加了一个称为“字符串文字类型”的新类型,该类型允许您声明一个只能是一组有限值之一的类型。他们举的例子是: type Easing = "ease-in" | "ease-out" | "ease-in-out"; 但是,在他们的所有示例中,类型要么是在其所使用的类之外定义的,要么是在没有别名的情况下内联定义的。正如在的答案中所解释的(相当简洁),类型别名声明的作用域是其包含的模块 在我的项目中,我想为与特定类配对并在多个位置使用的字符串文本定义类型别名。

在TypeScript 1.8中,他们添加了一个称为“字符串文字类型”的新类型,该类型允许您声明一个只能是一组有限值之一的类型。他们举的例子是:

type Easing = "ease-in" | "ease-out" | "ease-in-out";
但是,在他们的所有示例中,类型要么是在其所使用的类之外定义的,要么是在没有别名的情况下内联定义的。正如在的答案中所解释的(相当简洁),类型别名声明的作用域是其包含的模块

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

那么,有没有办法在类范围内声明一个
类型
(最好是从外部模块消耗)
如果没有,是否有一个接近的替代或计划的特性来填充这个用例


用例:

假设我有两个类包装我的底层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";
不能直接在类内定义类型(无论是嵌套类、枚举还是字符串文本类型)

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

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

我想我理解您的要求,但是您能否添加一些代码作为您打算如何使用此类型的示例?