Typescript 从数据库加载有区别的联合
我有一个歧视性的联盟,定义如下:Typescript 从数据库加载有区别的联合,typescript,discriminated-union,Typescript,Discriminated Union,我有一个歧视性的联盟,定义如下: enum ShapeKind { Square = 'sqaure', Rectangle = 'rectangle', } interface Square { kind: ShapeKind.Square; size: number; } interface Rectangle { kind: ShapeKind.Rectangle; width: number; height: number; } ty
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
这将执行如下数据库查询,并根据记录的种类
字段返回与接口匹配的对象:
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,
}
}
}