【发布时间】:2020-03-14 01:46:35
【问题描述】:
我开始在 typescript 中对 API 客户端进行建模,并寻找一些关于建模数据的正确方法的说明。 API 中的数据模型都共享一组通用属性(抽象),然后每个对象都有更具体的类型。还有一个每个对象将共享的公共元数据集 ($meta),但每个对象的某些值会有所不同。例如:
type Shapes = "Parallelogram" | "Triangle"
type QuadShapes = "Square" | "Trapezoid" | "Rectangle" | "Rhombus" | "Parallelogram"
type ParallelogramShapes = "Square" | "Rectangle" | "Rhombus" | "Parallelogram"
type TriangleShapes = "Isosceles" | "Scalene" | "Equilateral"
interface Meta {
id: number
number_of_sides: number,
type: Shapes,
is_quadrilateral: Boolean,
is_parallelogram: Boolean,
}
interface IShape {
$meta: Meta
}
interface IQuadrilateral extends IShape {
$meta.number_of_sides: number
}
interface IParallelogram extends IQuadrilateral {
$meta.number_of_parallel_sides: number
$meta.type: ParallelogramShapes
}
interface ITriangle extends IShape {
$meta.is_parallelogram: Boolean
$meta.type: TriangleShapes
}
// ISquare should look like:
// {
// $meta: {
// id: 1,
// type: "Parallelogram",
// parallelogram_type: "Square"
// is_parallelogram: true,
// is_quadrilateral: true,
// number_of_sides: 4,
// number_of_parallel_sides: 2
// },
// name: "Some Square"
// color: "Blue"
// }
interface ISquare extends IParallelogram {
// How do i define the $meta node?
$meta:
name: string,
color: string
}
class Square implements ISquare {
$meta: ?
name: string,
color: string
constructor(meta: any, name: string, color: string) {
this.$meta: meta
this.name: name.
this.color: color
}
}
我不确定我是否遗漏了什么,但我遇到的最大问题是如何将$meta 参数建模到接口中。如何以一致、非冗余的方式设置$meta.type 和$meta.is_parallelogram。
【问题讨论】:
标签: typescript class interface polymorphism