我有一个数据类型,大致如下:
interface Graph {
type: 'circle' | 'rectangle'
longth?: number
width?: number
radius?: number
area?: number
}
type
和area
属性必定存在type === 'circle'
的时候,radius
属性必定存在,width
和length
属性不存在type === 'rectangle'
的时候,width
和length
属性必定存在,radius
属性不存在
总的来说就是,根据type的变化,这个Graph
类型会有不同的属性
需要考虑到的情况:
- type可能有10种以上,并且随时都有可能加入新的图形(从而带来新的属性)
- 有的属性可能是两三种图形共有,有的可能是所有图形共有(但是新添加的图形可能让这个属性变成部分共有)。
这里需求涉及到分层的多种图形,比如
Graph
)Circle
)Rectangle
)每种具体的图形有什么属性自己决定,但作为
Graph
来说,只需要知道它的面积 (area
)。当然为了便于区分对象,还需要一个type
。那么,我们可以认为,
Circle
是Graph
,Rectangle
也是Graph
…… 可以使用继承关系这组关系中,
Graph
只需要type
和area
两个固有属性。其中type
要兼容所有子类中的重载,所以需要定义成string
。而Circle
和Rectangle
会继承Graph
的属性,同时会具体化type
,并添加一些自己特有的属性现在要加入正方形怎么办?虽然从常识上来说,正方形是矩形,但从类型的角度来说,
type
既然已经声明为rectangle
,就不可能具体化为square
。所以需要引入一个基类型RectangleBase
:建议学习一下“面向对象”的相关知识
还有我的课程「TypeScript从入门到实践 【2021 版】」,考虑一下!!