您可以将变量用于接口属性吗?

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:
    // ...
}

Playground