方法的返回类型' move()'在Interface Person中无效
interface Person {
name: string;
age?: number;
move(): void;
}
在函数定义中,move()方法返回一个数字
var p: Person = {
name: 'something',
move: () => { return 8; },
}
我不应该在打字稿中出错吗?
答案 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()}