Абстрактный метод TypeScript с использованием лямбда-функции/стрелки

Я использую TypeScript 1.6 и хотел бы создать абстрактный класс с абстрактным методом, но использовать функцию лямбда/стрелки в конкретном классе.

Это возможно? Код, показанный ниже, не компилируется, как он говорит

«Класс «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;
    }
}

person Craig Broadman    schedule 29.10.2015    source источник


Ответы (3)


Насколько я понимаю спецификации Typescript, когда вы объявляете

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

На самом деле вы объявляете property с именем def, а не method в классе Base.

Свойства не могут (к сожалению, ИМХО) быть абстрагированы в Typescript: https://github.com/Microsoft/TypeScript/issues/4669

person Bruno Grieder    schedule 29.10.2015
comment
Это, безусловно, сделало бы сообщение об ошибке более понятным. К сожалению, мой метод def вызывает функцию, которая возвращает обещание, и внутри обратного вызова обещания мне нужно сослаться на это, поэтому я хочу использовать функцию лямбда/стрелки. Поэтому я думаю, что мой единственный другой вариант — использовать var self = this; так далее - person Craig Broadman; 29.10.2015

Вы можете использовать абстрактное свойство:

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
person user764754    schedule 18.03.2019

Вы можете сделать это, начиная с машинописного текста 2.0. Чтобы сделать эту работу, вам нужно будет объявить тип для вашей стрелочной функции.

type defFuntion = () => void;

затем объявить

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

здесь ссылка на эту функцию

person Sergey Martynov    schedule 19.03.2018