TypeScript中子类方法能否仅进行类型覆盖?
TypeScript类方法类型覆盖的简化写法
原代码示例
class Foo { foo(): string | number { return 3 } } class Bar extends Foo { foo(): number { return super.foo() as number; } }
问题
当前Bar类中foo()方法的实现包含冗余的super.foo() as number语句,能否仅覆盖foo()方法的类型,写成如下形式以省略不必要的实现代码?
class Bar extends Foo { override foo(): number; }
解答
可以这么写,但要注意适用场景:
- 这种写法是TypeScript允许的仅类型声明的方法覆盖,此时
Bar的foo()不会有自定义实现,运行时会直接调用父类Foo的foo()逻辑。 - 因为父类
Foo的foo()实际返回的是number类型(尽管类型声明标注为string | number),所以在Bar中把返回类型缩小为number是类型安全的,TypeScript会认可这种覆盖。 - 如果父类
foo()实际可能返回string,那这种写法会存在运行时类型不匹配的风险,此时必须显式实现方法来确保返回number类型。
内容的提问来源于stack exchange,提问作者Matthieu Riegler
相关产品推荐
相关产品推荐

