TypeScript实现栈时使用getter触发类型不兼容错误求助
问题分析与解决
你遇到的错误核心是接口IStack<T>定义的size是一个方法,而父类Store<T>提供的size是一个getter属性,TypeScript判定这两者类型不兼容——方法类型() => number和数值类型number无法匹配。
方案一:修改接口,将size定义为属性
把IStack中的size()方法改为属性定义,和父类的getter属性保持一致:
interface IStack<T> { capacity: number; push(v: T): void; pop(): T | undefined; peek(): T | undefined; size: number; // 改为属性,而非方法 }
修改后,Stack类继承的size getter就能满足接口要求,错误会直接消失。
方案二:在Stack类中实现size方法
如果不想改动接口,可以在Stack类里补充实现接口要求的size方法,复用父类的getter逻辑:
class Stack<T> extends Store<T> implements IStack<T> { constructor(public capacity: number = Infinity) { super(); } push(v: T): void { if (this.isFull()) { throw new Error("Maximum capacity of stack reached."); } this.storage.push(v); } pop(): T | undefined { return this.storage.pop(); } peek(): T | undefined { return this.storage[this.size - 1]; } isFull(): boolean { return this.capacity === this.size; } // 新增size方法,实现接口要求 size(): number { return super.size; } }
这样既满足了接口的方法定义,又不用重复编写长度计算逻辑。
注意:你代码中peek、isFull方法里使用this.size的写法,无论采用哪种方案都不需要修改,因为父类的getter属性仍然可以正常访问。
内容的提问来源于stack exchange,提问作者James Blackwell
相关产品推荐
相关产品推荐

