在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
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句