Reputation: 185
I am using TypeScript 1.6 and would like to create an abstract class with an abstract method but use a lambda/arrow function in the concrete class.
Is this possible? The code shown below does not compile as it says
"Class 'Base' defines instance member function 'def', but extended class 'Concrete' defines it as instance member property"...
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;
}
}
Upvotes: 8
Views: 5520
Reputation: 4226
You can use an abstract property:
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
Upvotes: 2
Reputation: 406
You could do that starting typescript 2.0. In order to make that work you would need to declare a type for your arrow function
type defFuntion = () => void;
then declare
abstract class Base {
abstract abc(): void;
abstract readonly def: defFuntion;
}
here is a reference for this feature
Upvotes: 0
Reputation: 29814
My understanding of Typescript specifications is that when you are declaring
public def = (): void => {
this.setting = false;
}
You are actually declaring a property
called def
and not a method
on the Base
class.
Properties cannot (unfortunately IMHO) be abstracted in Typescript: https://github.com/Microsoft/TypeScript/issues/4669
Upvotes: 2