首页 > 解决方案 > 从数据库加载有区别的联合

问题描述

我有一个这样定义的有区别的工会:

enum ShapeKind {
  Square = 'sqaure',
  Rectangle = 'rectangle',
}

interface Square {
    kind: ShapeKind.Square;
    size: number;
}

interface Rectangle {
    kind: ShapeKind.Rectangle;
    width: number;
    height: number;
}

type Shape = Square | Rectangle;

我希望能够从数据库中加载它们。我有一个具有以下签名的方法:

getShape(kind: ShapeKind, id: string): Shape

这将执行如下数据库查询,并根据kind记录的字段返回与接口匹配的对象:

SELECT * FROM shapes WHERE id = ? AND kind = ? LIMIT 1

如果我传入,ShapeKind.Rectangle我知道它必须返回一个Rectangle(或抛出未找到的错误),但目前返回类型始终Shape与我传入的内容无关。

如何让编译器理解这条规则?

标签: typescriptdiscriminated-union

解决方案


您可以使用函数重载

function getShape(kind: ShapeKind.Rectangle, id: string): Rectangle
function getShape(kind: ShapeKind.Square, id: string): Square
function getShape(kind: ShapeKind, id: string): Shape {
  // Your query here  
  switch (kind) {
    case ShapeKind.Rectangle:
      return {
        kind: ShapeKind.Rectangle,
        width: 1,
        height: 1,
      }
    case ShapeKind.Square:
      return {
        kind: ShapeKind.Square,
        size: 1,
      }
  }
}

推荐阅读