У меня есть абстрактный класс с некоторыми абстрактными методами. Есть ли способ пометить некоторые из этих методов как необязательные?

abstract class Test { protected abstract optionalMethod?(): JSX.Element[]; protected abstract requiredMethod(): string; } 

По некоторым причинам я могу добавить ? в качестве суффикса, но кажется, что он вообще ничего не делает, потому что мне все еще нужно реализовать метод в производном классе. Сейчас я использую это так, чтобы отметить, что он может возвращать null что по сути является необязательным для бедняков.

 protected abstract optionalMethod?(): JSX.Element[] | null; 

Понятие абстрактного — это то, что не определено, но будет в унаследованных классах. Вот почему у нас не может быть абстрактных методов без реализации .

Я предлагаю вам создать неабстрактный метод, уже реализованный в вашем базовом классе, для достижения вашей цели:

 abstract class A { protected abstract requiredMethod(): string; protected emptyDefinition(): string | void {}; protected optionalMethod(): string { return "something optional"; }; } class B extends A { protected requiredMethod(): string { return "something required"; } } 

Typescript не поддерживает «пропуск» дополнительных абстрактных функций, но вы можете явно оставить его неопределенным, как показано ниже:

 abstract class Test { protected abstract optionalMethod?(): JSX.Element[]; protected abstract requiredMethod(): string; } class MyTest extends Test { protected optionalMethod: undefined; protected requiredMethod(): string { return 'requiredResult'; } } 

Вы можете сделать это с помощью слияния классов и интерфейсов:

 interface Foo { print?(l: string): void; } abstract class Foo { abstract baz(): void; foo() { this.print {amp}amp;{amp}amp; this.print('foo'); } } class Bar extends Foo { baz(): void { if (this.print) { this.print('bar'); } } } 

есть площадка