@romaro

Типы сигнатур функций в TypeScript это почти как делегаты в C#?

Я заметил, что в декларациях для некоторых JS-библиотек названия типов функций/методов содержат постфикс delegate.

Правильно ли я понимаю, что это такая перекличка с C#, где делегаты, хотя и являются объектами (т.е. в терминологии TS относятся к уровню значений), но выполняют схожую функцию: позволяют типобезопасно присвоить переменной ссылку на метод.

Мне хотелось бы точно понимать функцию делегатов в C#, потому что я планирую начать изучение этого языка, но сейчас больше интересует семантика использования этого постфикса в TS.

Выглядит так, что его можно добавлять к любым типам, которые описывают сигнатуры функций в дополнение к тому, как многие добавляют префикс I для объявления интерфейсов (т.е. объектных типов). Хотя официально это и не рекомендуется, но мне кажется более читаемым:
IResponse // вместо ResponseObject
HandlerDelegate // Вместо HandlerFunc
  • Вопрос задан
  • 152 просмотра
Решения вопроса 1
bingo347
@bingo347 Куратор тега TypeScript
Crazy on performance...
Функциональные типы в TS - это типы, значением которых может являться любая функция с совместимой сигнатурой. Методы классов - это те же функции. При этом надо помнить, что this в JS/TS определяется вызовом, а не объявлением функции/метода.
И это существенно отличает их от делегатов в шарпе, которые по своей сути являются умной ссылкой на метод конкретного инстанса.

Аналог делегата из шарпа на TS может выглядеть как то так:
class Delegate<Target, Args extends any[], Ret> {
    constructor(
        private target: Target,
        private method: (this: Target, ...args: Args) => Ret,
    ) {}

    public invoke(...args: Args): Ret {
        return this.method.apply(this.target, args);
    }
}
Вот только конструировать такой делегат в отличии от шарпа придется явно.

https://www.typescriptlang.org/play?#code/MYGwhgzh...
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
Делегат в шарпе - это объект с методом Invoke, который наследуется от базового Delegate.
Да, это способ безопасно сделать ссылку на функцию/метод или работать с анонимными методами/функциями.
И оно, очевидно, находится в плоскости значений, а не типов. (Вернее Func - из области типов, а экземпляр - из области значений)

В TS что-то похожее, но уже с экземплярами function
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы