您可以将变量用于接口属性吗?
Can you use variables for interface properties?
假设我有一个典型的歧视联合的例子:
interface Circle {
type: 'circle';
radius: number;
}
interface Square {
type: 'square';
width: number;
}
type Shape = Circle | Square;
然后我把它放在开关盒中:
switch (shape.type) {
case 'circle':
...
case 'square':
...
}
是否可以使用变量让我以单数方式引用判别式?
您可以使用枚举。在打字稿中,变量仅用作值,而字符串可以同时用作变量和类型(例如 'circle')。有关详细信息,请参阅 Declaration Merging。
然而,枚举也同时充当变量和类型,因此在上面的示例中,您可以像这样创建一个枚举:
enum ShapeType {
Circle = 'circle',
Square = 'square',
}
并相应地替换界面中的类型,例如:
interface Circle {
type: ShapeType.Circle;
radius: number;
}
并在 switch case 中引用枚举(例如 case ShapeType.Circle:
)
您可以定义常量。它们的类型将被推断为文字类型。然后你可以使用 typeof
运算符来获取变量的类型:
const circle = 'circle';
const square = 'square';
interface Circle {
type: typeof circle;
radius: number;
}
interface Square {
type: typeof square;
width: number;
}
type Shape = Circle | Square;
declare const shape: Shape;
switch (shape.type) {
case circle:
// ...
case square:
// ...
}
假设我有一个典型的歧视联合的例子:
interface Circle {
type: 'circle';
radius: number;
}
interface Square {
type: 'square';
width: number;
}
type Shape = Circle | Square;
然后我把它放在开关盒中:
switch (shape.type) {
case 'circle':
...
case 'square':
...
}
是否可以使用变量让我以单数方式引用判别式?
您可以使用枚举。在打字稿中,变量仅用作值,而字符串可以同时用作变量和类型(例如 'circle')。有关详细信息,请参阅 Declaration Merging。
然而,枚举也同时充当变量和类型,因此在上面的示例中,您可以像这样创建一个枚举:
enum ShapeType {
Circle = 'circle',
Square = 'square',
}
并相应地替换界面中的类型,例如:
interface Circle {
type: ShapeType.Circle;
radius: number;
}
并在 switch case 中引用枚举(例如 case ShapeType.Circle:
)
您可以定义常量。它们的类型将被推断为文字类型。然后你可以使用 typeof
运算符来获取变量的类型:
const circle = 'circle';
const square = 'square';
interface Circle {
type: typeof circle;
radius: number;
}
interface Square {
type: typeof square;
width: number;
}
type Shape = Circle | Square;
declare const shape: Shape;
switch (shape.type) {
case circle:
// ...
case square:
// ...
}