我有这个界面:
interface IPoint {
getDist(): string;
getDist(x: number): any;
}
我需要一个类来实现它,但我无法获得正确的语法来实现getDist()方法 在课堂上..
class Point implements IPoint {
// Constructor
constructor (public x: number, public y: number) { }
pointMethod() { }
getDist() {
Math.sqrt(this.x * this.x + this.y * this.y);
}
// Static member
static origin = new Point(0, 0);
}
它说:
Class'Point'声明接口'IPoint'但不实现它: 类型'Point'和'IPoint'的属性'getDist'的类型是 不兼容:调用类型'()=>的签名void'和'{():string; (x:数字):任何; }'不兼容
这样做的正确方法是什么?
由于
答案 0 :(得分:3)
This answer描述了如何在TypeScript中实现方法重载,它并不漂亮:
interface IPoint {
getDist(): string;
getDist(x: number): any;
}
class Point implements IPoint {
// Constructor
constructor (public x: number, public y: number) { }
pointMethod() { }
getDist(x?: number) {
if (x && typeof x == "number") {
return 'foo';
} else {
return 'bar';
}
}
}
N.B。如果界面中声明的返回类型的特定组合,则仅限于从getDist
返回字符串。
答案 1 :(得分:3)
当您在类中声明函数时,需要使用重载来装饰它:
getDist(): string;
getDist(x: number): any;
getDist(x?: number): any {
// your code
}
答案 2 :(得分:0)
以下是其中一些内容的变体
class Position {
x: number;
y: number;
constructor(x : number = 0, y : number = 0) {
this.x = x;
this.y = y;
}
}
class Pen {
colour: string;
constructor(colour: string) {
this.colour = colour;
}
}
class PlottingHead {
isPenUp: boolean;
pen: Pen;
position: Position;
constructor() {
this.penUp();
}
move(p: Position): void;
move(x: number, y: number): void;
move(x: number | Position, y?: number): void {
if (typeof x === "number")
{
x = new Position(x, y);
}
this.penUp();
this.position = x;
}
draw(x: number | Position, y?: number): void {
if (typeof x === "number")
{
x = new Position(x, y);
}
this.penDown();
this.position = x;
}
penDown(): void {
this.isPenUp = false;
}
penUp(): void {
this.isPenUp = true;
}
onChangePen(newPen: Pen) {
this.penUp();
this.pen = newPen;
}
}
move
函数采用单个位置对象或一对数值。显然,可以根据需要进行扩展。
答案 3 :(得分:0)
您也可以使用默认值
li