8

我正在使用 TypeScript 1.6,并希望使用抽象方法创建一个抽象类,但在具体类中使用 lambda/arrow 函数。

这可能吗?下面显示的代码不会像它所说的那样编译

“类'Base'定义了实例成员函数'def',但扩展类'Concrete'将其定义为实例成员属性”......

abstract class Base {
    abstract abc(): void;
    abstract def(): void;
}

class Concrete extends Base {
    private setting: boolean;

    public abc(): void  {
        this.setting = true;
    }

    public def = (): void => {
        this.setting = false;
    }
}
4

3 回答 3

2

我对 Typescript 规范的理解是,当你声明

public def = (): void => {
    this.setting = false;
}

你实际上是在类上声明一个property被调用def而不是一个。methodBase

属性不能(不幸的是恕我直言)在 Typescript 中抽象:https ://github.com/Microsoft/TypeScript/issues/4669

于 2015-10-29T09:24:43.077 回答
1

您可以使用抽象属性:

abstract class Base {    
    abstract def: () => void; // This is the abstract property
}

class Concrete extends Base {
    private setting: boolean;    

    public def = (): void => {
        this.setting = false;
    }
}

var myVar: Base = new Concrete();
myVar.def();
console.log((myVar as any).setting); // gives false
于 2019-03-18T16:30:36.470 回答
0

你可以从 typescript 2.0 开始。为了完成这项工作,您需要为箭头函数声明一个类型

type defFuntion = () => void;

然后声明

abstract class Base {
    abstract abc(): void;
    abstract readonly def: defFuntion;
}

是此功能的参考

于 2018-03-19T21:42:43.470 回答