是否可以在 TypeScript 中的 class 中定义类型(字符串文字联合)?
Is it possible to define a type (string literal union) within a class in TypeScript?
在 TypeScript 1.8 中,他们添加了一个名为 "string literal type" 的新类型,它允许您声明一个只能是一组有限值中的一个的类型。他们给出的例子是:
type Easing = "ease-in" | "ease-out" | "ease-in-out";
但是,在他们所有的示例中,类型要么定义在 外部 中使用,要么在没有别名的情况下内联定义。正如 的答案中所解释的(相当简洁),类型别名声明的范围仅限于它们的包含模块。
在我的项目中,我想为与特定 classes 配对并在多个地方使用的字符串文字定义类型别名。由于我正在使用的 API 的结构,存在多个 class ,每个都具有名称相同但潜在值不同的属性。我想保持我的代码整洁并且没有一堆带有前缀(MyClassAPropertyValue
、MyClassBPropertyValue
等)的全局类型声明,如果我能帮助的话。
那么,有没有办法在 class 范围内声明一个 type
(最好是这样它可以从外部模块使用)? 如果没有, 是否有相近的替代品或计划中的功能来填充此用例?
用例:
假设我有两个 class 包装我的底层 API 数据。每个 class 代表不同的数据,它们只是碰巧有一些同名的属性。我想要一种定义属性的方法:
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";
您不能直接在 class 中定义类型(无论它们是嵌套的 classes、枚举还是字符串文字类型)。
但是,如 所示,您可以通过在同名模块中定义嵌套类型来解决这个问题。
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";
}
请注意,您需要为 return 类型的属性使用完全限定名称。例如,您需要使用 APIObjectB.Property1Value
而不是 Property1Value
.
在 TypeScript 1.8 中,他们添加了一个名为 "string literal type" 的新类型,它允许您声明一个只能是一组有限值中的一个的类型。他们给出的例子是:
type Easing = "ease-in" | "ease-out" | "ease-in-out";
但是,在他们所有的示例中,类型要么定义在 外部 中使用,要么在没有别名的情况下内联定义。正如
在我的项目中,我想为与特定 classes 配对并在多个地方使用的字符串文字定义类型别名。由于我正在使用的 API 的结构,存在多个 class ,每个都具有名称相同但潜在值不同的属性。我想保持我的代码整洁并且没有一堆带有前缀(MyClassAPropertyValue
、MyClassBPropertyValue
等)的全局类型声明,如果我能帮助的话。
那么,有没有办法在 class 范围内声明一个 type
(最好是这样它可以从外部模块使用)? 如果没有, 是否有相近的替代品或计划中的功能来填充此用例?
用例:
假设我有两个 class 包装我的底层 API 数据。每个 class 代表不同的数据,它们只是碰巧有一些同名的属性。我想要一种定义属性的方法:
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";
您不能直接在 class 中定义类型(无论它们是嵌套的 classes、枚举还是字符串文字类型)。
但是,如
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";
}
请注意,您需要为 return 类型的属性使用完全限定名称。例如,您需要使用 APIObjectB.Property1Value
而不是 Property1Value
.