类型脚本重写为空返回的抽象方法 [英] Typescript overriding abstract method which is void return

查看:9
本文介绍了类型脚本重写为空返回的抽象方法的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

abstract class Base{
    abstract sayHello(): void;
}

class Child extends Base{
    sayHello() {
        return 123;
    }
}

抽象方法的返回类型为void,但我可以使用Number类型返回来实现它。 我没有从编译器那里得到任何错误。打字稿中是否存在此类错误?

TS Spec

VOID类型,由VOID关键字引用,表示缺勤 ,并用作不返回的函数的返回类型 值。

推荐答案

背后的原因是因为TypeScrip中的类型系统在结构类型系统上工作。类型的概念有点像"契约",其中的规则被设置为说某些类型与某些类型兼容。只有当约定被破坏时,编译器才会出错。 例如:

abstract class Base{
    abstract sayHello(): void;
}

class Child extends Base{
    sayHello(): number {
        return 123;
    }
}

这是因为,即使我们的方法在实现时返回Numbers,使用sayHello()并期望它返回空的所有东西都不会有副作用,也不会破坏任何约定。这很简单,因为Microsft在TypeScrip中设置了一条规则,说明VOID返回类型与数字返回类型兼容。原因是,正如我之前所说的,它没有副作用,所有期望sayHello()返回空的东西应该仍然可以正常工作。

另一方面,如果我这样做:

abstract class Base{
    abstract sayHello(): number;
}

class Child extends Base{
    sayHello(): void {
        return;
    }
}

这将出错,因为现在使用sayHello()并期望其为数字的所有内容都将受到影响,类型协定已被破坏,从而导致编译器错误。

您可以将其视为类型系统中的灵活性的一个特性,在权衡意外类型等价的情况下。

在像C#这样使用名义类型系统的语言中,它不允许我们有一个抽象的空方法,该方法在实现时返回字符串,因为它关注类型等价性,类型必须相同才能相互兼容。

希望这能有所帮助!

结构类型体系:https://en.wikipedia.org/wiki/Structural_type_system

标称类型系统:https://en.wikipedia.org/wiki/Nominal_type_system

类型兼容性:https://www.typescriptlang.org/docs/handbook/type-compatibility.html

规格:https://github.com/Microsoft/TypeScript/blob/master/doc/spec.md#3114-assignment-compatibility

这篇关于类型脚本重写为空返回的抽象方法的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆