【问题标题】:Not getting an error for following implementation of Interface in Typescript在 Typescript 中执行接口后没有收到错误
【发布时间】:2016-07-20 20:34:25
【问题描述】:

Interface Person中方法'move()'的返回类型为void

interface Person {
     name: string;
     age?: number;
     move(): void;
 }

在函数定义中 move() 方法返回一个数字

var  p: Person = {
    name: 'something',
    move: () => { return 8; },
}

我应该不会在 Typescript 中遇到错误吗?

【问题讨论】:

    标签: typescript


    【解决方案1】:

    这看起来很奇怪,但也很有意义。

    第一件事:javascript函数总是返回,如果没有使用显式返回语句,那么它会自动return undefined,你可以在Why JavaScript functions always return a value?Does every Javascript function have to return a value?阅读更多关于它的信息。
    所以即使你说你的函数返回void,它实际上也返回undefined

    即使接口声明为 void,返回数字也没有冲突,因为如果你这样做:

    let a = p.move() + 1;
    

    你会得到:

    运算符“+”不能应用于类型“void”和“number”

    因为p 被定义为Person
    但即使这样也很好:

    class MyPerson implements Person {
        name = "name";
        age = 8;
        move(): number {
            return this.age;
        }
    }
    
    let p1 = new MyPerson();
    let p2: Person = new MyPerson();
    
    let a1 = p1.move() + 1; // fine
    let a2 = p2.move() + 1; // same error as before
    

    在这种情况下,如果您有一个Person,那么move 返回一个void,如果您有一个MyPerson,那么它返回一个数字。

    为什么会发生这种情况是因为即使接口声明它应该是无效的,返回值也是安全的,这就是为什么你的对象和我的类满足接口定义的契约。
    这是安全的,因为如果有人使用您的代码(或 IDE),他认为实现该接口的对象返回 void,该函数稍后将在运行时返回一个值这一事实不会改变任何事情(如果您“编译器会出错”将函数视为返回值)。

    另一方面,如果反过来:

    interface Person {
         name: string;
         age?: number;
         move(): number;
    }
    
    var p: Person = {
         name: 'something',
         move: (): void => {  }
    }
    

    您收到一条错误消息,指出该对象不可分配给类型 Person

    【讨论】:

      【解决方案2】:

      根据 Nitzan 的回答,也许可以假设使用返回 void 的函数实现接口是没有意义的,因为每个函数都应该返回一些东西,无论它是未定义的、字符串、num、obj 等。

      interface Person{
         move():void //meaningless type declaration}
      

      一样
      interface Person{
         move()}
      

      【讨论】:

        猜你喜欢
        • 2017-11-27
        • 2017-05-03
        • 1970-01-01
        • 1970-01-01
        • 2020-09-13
        • 2023-01-30
        • 2014-10-10
        • 2022-08-24
        • 2014-12-06
        相关资源
        最近更新 更多