type Elem = {}
class List {
elems: Elem[] = []
remove(index: number): Elem
remove(elem: Elem): boolean
remove(indexOrElem: number | Elem): Elem | boolean {
// TODO 该函数有歧义(当参数与数组元素均为number类型时,是按照index还是ele方式来处理),暂定先按index来处理
if (typeof indexOrElem === 'number') {
const [ deletedEle ] = this.splice(indexOrElem, 1)
return deletedEle
} else {
const index = this.indexOf(indexOrElem)
if (index === -1) {
return false
} else {
this.remove(index)
return true
}
}
}
splice(index: number, deleteCount: number): Elem[] {
return this.elems
}
indexOf(ele: Elem): number {
return 0
}
}
const list = new List()
const elem = list.remove(0)
const boolean = list.remove({} as Elem)
虽然重载可以解决这个问题,但是按着问题描述 elem 是一个 any 类型,那么就意味着它可以是一个数字,那么当它是数字时是应该走索引的逻辑还是元素的逻辑呢?这样这个 API 就很保证稳定的工作,所以个人不太建议设计这样的 API。
可以考虑将 API 拆细一些,保证功能的单一。
remove(elem: Elem) {
const index = this.indexOf(elem)
if (index === -1) {
return false
} else {
this.remove(index)
return true
}
}
removeByIndex(index: number) {
const [ deletedEle ] = this.splice(index, 1)
return deletedEle
}