Typescript - Как передать указатель на функцию в функцию и вызвать ее в теле функции - PullRequest
1 голос
/ 09 июля 2019

Я пытаюсь передать указатель функции в существующую функцию в Typescript.Ниже должно работать, но при звонке agreet() я получаю неопределенное, почему?

function greeter(greetFuncPtr) {
  console.log(greetFuncPtr); // returns ƒ () { greet(); }
  console.log(greetFuncPtr()); // returns undefined
  console.log(greet()); // returns "Hello"
  return greetFuncPtr();
}

function greet() {
  return "Hello";
}


document.querySelector("#app").innerHTML = greeter(() => { greet(); });

См. Скрипку здесь https://jsfiddle.net/17w246uz/

Ответы [ 2 ]

2 голосов
/ 09 июля 2019

Синтаксис, который вы используете в функции стрелки, подразумевает, что результат greet не возвращается функцией стрелки, чтобы вернуть его, вам нужно будет использовать return

function greeter(agreet: () => string) { 
    console.log(agreet); // returns ƒ () { greet(); }
    console.log(agreet()); // returns undefined
    console.log(greet()); // returns "Hello"
    return agreet();
}

function greet() {
    return "Hello";
}


greeter(() => { return greet() });

Или нетиспользуйте {}:

greeter(() => greet());

Или передайте функцию напрямую:

greeter(greet);

Примечание Тип, добавленный в agreet, предотвратит ошибкуво-первых, поскольку вы получили бы ошибку, что переданная функция стрелки вернула void вместо string

0 голосов
/ 09 июля 2019

В функции стрелки, которую вы передаете, вызывая greeter(() => {greet()}), вы пропускаете оператор return.Следовательно, он возвращает undefined.

Простое решение: а) добавить оператор return или б) снять фигурные скобки:

function greeter(agreet) {
  return agreet();
}

function greet() {
  return "Hello";
}


console.log(greeter(() => {return greet()}));
console.log(greeter(() => greet()));
...