Вывод подписи метода подкласса

У меня есть следующий абстрактный класс

// AbstractFiller.ts
export abstract class AbstractFiller {
   public abstract fill(data: number | string | boolean | Date, numberOfFillers: number): string;
}

и несколько подклассов наполнителей

export class WhiteSpacesFiller extends AbstractFiller {
  public fill(data: number | string | boolean | Date, numberOfFillers: number): string {
    // logic
  }
}

export class ZerosFiller extends AbstractFiller {
  public fill(data: number | string | boolean | Date,  numberOfFillers: number): string {
    // logic
  }
}

// ...etc

Есть ли способ, которым TS выведет сигнатуру метода из абстрактного класса, чтобы у меня было:

  1. Отсутствие дублирования типов в каждом подклассе
  2. Строгое соблюдение подписи, например. удаление number из типа data в подклассе вызовет ошибку нет.
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
2
0
54
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Typescript не будет выводить параметры метода из базового класса. Это работает следующим образом: после того, как класс типизирован, он проверяется на совместимость с базовым классом. Это означает, что параметр в производном классе может иметь производный тип (это не правильно, но параметры метода класса относятся бивариантно даже при строгой нулевой проверке).

Одна вещь, которую можно сделать, чтобы уменьшить количество дублирования типов, — это использовать Parameters с деструктурированием остальных параметров.

export abstract class AbstractFiller {
    public abstract fill(data: number | string | boolean | Date, numberOfFillers: number): string;
}

export class WhiteSpacesFiller extends AbstractFiller {
    public fill(...[data, numberOfFillers]: Parameters<AbstractFiller['fill']>): string {
        return ""
    }
}

Спасибо за ответ. Хм, это интересно. Не знал, что ты так умеешь. Это общепринятый подход? Какие-либо проблемы, с которыми вы столкнулись при использовании этого подхода?

Roland Jegorov 29.05.2019 13:52

@RolandJegorov сам мало использовал его ... но он должен работать ... если у вас есть какие-либо проблемы, дайте мне знать. Хотя я уверен, что другого пути нет :)

Titian Cernicova-Dragomir 29.05.2019 13:54

Хорошо, спасибо. Я оставлю это открытым на день или два, а затем, если ничего не появится, приму ваш ответ. :)

Roland Jegorov 29.05.2019 13:57

Кроме того, просто чтобы добавить к пункту строгого соблюдения подписи, который я написал выше, кажется, что любой тип аргумента будет действительным, пока он является подмножеством подписи метода абстрактных классов. string | number and string Надеюсь, я объяснил достаточно понятно.

Roland Jegorov 29.05.2019 14:04

@RolandJegorov Да, это правда, к сожалению, предотвратить это невозможно.

Titian Cernicova-Dragomir 29.05.2019 14:07

Извините, если я неправильно понял вопрос, но я думаю, что вы можете решить свою проблему с помощью дженериков, то есть сделать ваш класс AbstractFiller универсальным.

Это будет выглядеть примерно так:

export abstract class AbstractFiller<T> {
    public abstract fill(data: T, numberOfFillers: number): string;
}

export class WhiteSpacesFiller extends AbstractFiller<string> {
    public fill(data: string, numberOfFillers: number) {
        //logic
        return data;
    }
} 

export class ZerosFiller extends AbstractFiller<number> {
    public fill(data: number, numberOfFillers: number) {
        return data.toString();
    }
}

Эй, спасибо за ответ. Моя цель заключалась в том, чтобы иметь возможность сделать что-то вроде public fill(data, numberOfFillers). Кроме того, здесь кажется, что дублирование было перемещено, а не устранено.

Roland Jegorov 29.05.2019 13:51

Другие вопросы по теме