![](/img/trans.png)
[英]Is there a way to create string literal union type from and object in Typescript?
[英]Is it possible to define a type (string literal union) within a class in TypeScript?
在TypeScript 1.8中,他们添加了一个名为“字符串文字类型”的新类型,它允许您声明一种只能是一组有限值之一的类型。 他们给出的例子是:
type Easing = "ease-in" | "ease-out" | "ease-in-out";
但是,在他们的所有示例中,类型要么在类之外定义,要么在内联中使用,要么在没有别名的情况下内联定义。 正如在这个问题的答案中(相当简洁地)解释的那样,类型别名声明的范围限定在它们的包含模块中。
在我的项目中,我想为字符串文字定义类型别名,这些字符串文字与特定类配对并在多个地方使用。 由于我正在使用的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";
您不能直接在类中定义类型(无论它们是嵌套类,枚举还是字符串文字类型)。
但是,如本答案所示,您可以通过在同名模块中定义嵌套类型来解决这个问题。
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
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.