函数在接口和类中重载 - 如何?

时间:2012-11-04 14:12:26

标签: class interface overloading typescript

我有这个界面:

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:数字):任何; }'不兼容

这样做的正确方法是什么?

由于

4 个答案:

答案 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