typescript - 从数据库加载有区别的联合
问题描述
我有一个这样定义的有区别的工会:
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
与我传入的内容无关。
如何让编译器理解这条规则?
解决方案
您可以使用函数重载:
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,
}
}
}
推荐阅读
- azure - 使用 python sdk 在 azure 中的 linux vm 中运行命令
- rest - 没有 Appserver 的 API 调用
- android - 将数据从 Fragment 返回到 Activity
- jquery - 当空间包含数据列表时仅显示第一部分
- c# - SQL Cube(分析服务)消费
- javascript - 正则表达式在 Node.js/Javascript 中不匹配
- java - 我可以使用两个或多个日志级别 INFO、ERROR 但不是 ALL
- search - ejabberd 搜索 - 模块无法处理查询
- angular - 角度无法在模型中找到切换功能
- android - React Native Android Hardware Back 按钮无法正常工作