Возникли проблемы с пониманием сигнатур вызовов

#typescript #function

#машинописный текст

Вопрос:

Прошу прощения, если это немного глупый вопрос. Я немного слышал о сигнатурах вызовов в машинописном тексте, но я не совсем понимаю, что они делают. В документации к машинописному тексту говорится:

В JavaScript функции могут иметь свойства в дополнение к возможности вызова. Однако синтаксис выражения типа функции не позволяет объявлять свойства. Если мы хотим описать что-то вызываемое с помощью свойств, мы можем написать подпись вызова в типе объекта:

 type DescribableFunction = {  description: string;  (someArg: number): boolean; }; function doSomething(fn: DescribableFunction) {  console.log(fn.description   " returned "   fn(6)); }  

В документации не приводится никаких примеров того, как вы бы на самом деле позвонили doSomething (и у вас нет практически никаких ресурсов, которые я нашел по этой теме), и я не понимаю, что это значит «что-то вызываемое со свойствами». И что именно это (someArg: number): boolean; значит? Похоже, что он определяет функцию с возвращаемым типом логического значения, которая принимает числовой аргумент с именем someArg , но передача функции ничего не делает. Итак… что именно это значит? Опять же, я исследовал подписи вызовов, но все, что я нашел, в значительной степени просто говорит «подписи вызовов подробно описывают функции», что не очень полезно. Что именно такое подписи вызовов?

Комментарии:

1. Подпись вызова просто определяет аргументы, которые принимает функция (и их типы), и тип, возвращаемый функцией. Если интерфейс имеет сигнатуру вызова, это означает, что значение, которое он описывает, должно быть функцией. Если функция реализует подпись вызова, это означает, что ее аргументы и тип возвращаемого значения должны соответствовать этой подписи вызова.

Ответ №1:

как бы вы на самом деле назвали doSomething

Это функция, поэтому вы бы вызвали ее (либо изнутри, doSomething либо снаружи), как любую функцию: fn(6) это пример ее вызова.

и я не понимаю, что это значит под «чем-то, что можно назвать свойствами».

Функции-это особый вид объектов в JavaScript, и любой объект может иметь произвольные пары ключ-значение, связанные с ними. Обычно это странно видеть, но это возможно:

 const myFn = (someArg) =gt; {  return someArg gt; 5; }; myFn.description = 'checks if arg is greater than 5';  console.log(myFn(10)); console.log(myFn.description); 

Это на простом JavaScript. Машинопись работает точно так же, за исключением того, что вам нужно правильно печатать.

И что именно означает (someArg: число): логическое; означает? Похоже, что он определяет функцию с возвращаемым типом логического значения, которая принимает числовой аргумент с именем someArg,

Совершенно верно.

но передача функции ничего не делает

Так и должно быть. Вот пример в JS:

 const myFn = (someArg) =gt; {  return someArg gt; 5; }; myFn.description = 'checks if arg is greater than 5';   function doSomething(fn) {  console.log(fn.description   " returned "   fn(6)); }   doSomething(myFn); 

Комментарии:

1. Оооо. Я думал, что вы должны были передать аргумент описания и функцию, но на самом деле вы просто должны передать функцию. В этом гораздо больше смысла.

2. Этот пример приведен в JS, а не в TS, он не проливает слишком много света на типобезопасный способ определения a DescribableFunction . На самом деле, если вы определите функцию в TS, она не сможет транспилироваться, потому что в ней отсутствует требуемое свойство «описание».

Ответ №2:

Значение (someArg: число): логическое в описываемой функции означает, что любая функция, которая должна имитировать описываемую функцию, должна:

  1. Есть один аргумент с номером типа
  2. Тип возвращаемого значения должен быть логическим

Если он удовлетворяет этим условиям, теперь он имеет право использовать свойства (объекта)описываемой функции.

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

 type DescribableFunction = {  description: string;  (someArg: number): boolean; }; function doSomething(fn: DescribableFunction) {  console.log(fn.description   " returned "   fn(6)); }  

Допустим, функция «вызываемая» хочет действовать как объект, тогда

 const callable = (num) =gt; {  return num gt; 5; }  

Из приведенного выше кода вы можете видеть, что вызываемая функция удовлетворяет первым двум необходимым условиям(т. Е. У нее есть аргумент с номером типа и возвращаемым типом логического значения). Затем он должен определить свойства описываемой функции наряду с их правильным типом.

 callable.description = "Number is greater than 5";  

Теперь он выполнил все условия. Далее, давайте вызовем функцию doSomething

 doSomething(callable)  

Результатом будет

 Number is greater than 5 returned true