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

时间:2019-05-26 07:52:46

标签: javascript typescript typescript-typings discriminated-union

假设我有歧视工会的经典例子:

interface Circle {
  type: 'circle';
  radius: number;
}
interface Square {
  type: 'square';
  width: number;
}
type Shape = Circle | Square;

然后我把它放在开关盒中

switch (shape.type) {
  case 'circle':
    ...
  case 'square':
    ...
}

是否可以使用变量允许我以单一方式引用判别式?

2 个答案:

答案 0 :(得分:0)

您可以使用一个枚举。在打字稿中,变量仅用作值,而字符串既可以充当变量也可以充当类型(例如'circle')。有关更多信息,请参见Declaration Merging

但是枚举同时也充当变量和类型,因此在上面的示例中,您可以像这样创建枚举:

enum ShapeType {
  Circle = 'circle',
  Square = 'square',
}

并相应地替换界面中的类型,例如:

interface Circle {
  type: ShapeType.Circle;
  radius: number;
}

并引用切换情况下的枚举(例如case ShapeType.Circle:

答案 1 :(得分:0)

您可以定义常量。它们的类型将被推断为文字类型。然后,您可以使用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