以下在Typescript中实现Interface的错误

时间:2016-07-20 20:34:26

标签: typescript

方法的返回类型' move()'在Interface Person中无效

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

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

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

我不应该在打字稿中出错吗?

2 个答案:

答案 0 :(得分:1)

看起来很奇怪,但也有道理。

第一件事:javascript函数总是返回,如果没有使用显式return语句,那么它会自动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,则会返回一个数字。

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

另一方面,如果是相反的方式:

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

var p: Person = {
     name: 'something',
     move: (): void => {  }
}

您收到错误消息,指出该对象无法分配给Person类型。

答案 1 :(得分:0)

跟随Nitzan的回答,或许可以假设用一个返回void的函数实现一个接口是没有意义的,因为每个函数都应该返回一些内容,无论是undefined,string,num,obj等

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

相同
interface Person{
   move()}