Как обратный вызов в Typescript?

Я объявил функцию:

 _translate(value: T, callback: (name: T) => T): void;

И функция:

public _translate(value: T, callback: T) {
    if (!this.translate) {
      callback(value);
    }
}

Как это называть (использовать)? Я попробовал следующее:

this._translate(value, function(data: T) {
   console.info(data);
});

Это не работает

Вы говорите, что объявляете функцию, где? Должен быть определен как public _translate(value: T, callback: (name: T) => T) { .. }

Titian Cernicova-Dragomir 02.04.2018 15:05

Вам нужно включить больше кода, если вы хотите получить хороший ответ. Пожалуйста, посмотрите, что представляет собой минимальный воспроизводимый пример.

jcalz 02.04.2018 15:13

Не зная больше, похоже, что ваш параметр callback должен быть функцией, которая принимает ввод типа T и возвращает вывод типа T. Но используемая вами функция ничего не возвращает; он просто регистрируется в консоли. Таким образом, либо ваше объявление неверно (должно быть (name: T)=>void), либо ваша функция неверна (должна заканчиваться на return data;). Это предположения, основанные на ваших фрагментах кода. Более точный ответ может быть получен, если вы предоставите дополнительную информацию.

jcalz 02.04.2018 15:15

Хорошо, см. Фрагмент здесь: goo.gl/zqThvj

dooglu 02.04.2018 15:21
Зод: сила проверки и преобразования данных
Зод: сила проверки и преобразования данных
Сегодня я хочу познакомить вас с библиотекой Zod и раскрыть некоторые ее особенности, например, возможности валидации и трансформации данных, а также...
Как заставить Remix работать с Mantine и Cloudflare Pages/Workers
Как заставить Remix работать с Mantine и Cloudflare Pages/Workers
Мне нравится библиотека Mantine Component , но заставить ее работать без проблем с Remix бывает непросто.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
TypeScript против JavaScript
TypeScript против JavaScript
TypeScript vs JavaScript - в чем различия и какой из них выбрать?
Синхронизация localStorage в масштабах всего приложения с помощью пользовательского реактивного хука useLocalStorage
Синхронизация localStorage в масштабах всего приложения с помощью пользовательского реактивного хука useLocalStorage
Не все нужно хранить на стороне сервера. Иногда все, что вам нужно, это постоянное хранилище на стороне клиента для хранения уникальных для клиента...
Что такое ленивая загрузка в Angular и как ее применять
Что такое ленивая загрузка в Angular и как ее применять
Ленивая загрузка - это техника, используемая в Angular для повышения производительности приложения путем загрузки модулей только тогда, когда они...
1
4
3 882
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Попробуй это:

// parameters: 
//   value, instance of T.
//   callback: function, accepting parameter (name) that is instance of T and returns object that is instance of T.
// returns: Void.
public _translate(value: T, callback: (name:T) => T): void {

}

а затем назвать это:

this._translate(value, (data: T): T => {
    return {};
});

Но что тут не так: public _translate(value: T, callback: T) { if (!this.translate) { callback(value); }

dooglu 02.04.2018 15:04

На линии: callback(value); ?

dooglu 02.04.2018 15:04

В вашем случае я получаю :any, не относящийся к типу T

dooglu 02.04.2018 15:06

Попробуй. Прошло много времени с момента написания TS.

S. Walker 02.04.2018 15:08

Не работает, кажется я ошибся в _translate(value: T, callback: T);

dooglu 02.04.2018 15:09

Приведенный выше код не является допустимым TypeScript. Я думаю, вам может потребоваться попробовать что-то в компиляторе TypeScript (вот один), если вы собираетесь предлагать код

jcalz 02.04.2018 15:18

Я прошу прощения. Я только что отредактировал код. Он должен быть действителен сейчас.

S. Walker 02.04.2018 15:24

Проблема в строке: this._translate(value, (data: T): T => {... Сообщение об ошибке: функция должна возвращать значение

dooglu 02.04.2018 15:27

У вас есть инструкция return внутри функции? Должен ли обратный вызов что-то возвращать? Так вы это написали.

S. Walker 02.04.2018 15:28

Никакая функция не возвращает, но есть обратный вызов: посмотрите: public _translate(value: T, callback: (name: T) => T): void {}

dooglu 02.04.2018 15:32
Ответ принят как подходящий

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

_translate(value: T, callback: (name: T) => void): void;

Это означает, что параметр callback должен быть функцией, которая принимает входные данные типа T и ничего не возвращает (void). Затем вам нужно изменить сигнатуру реализации, чтобы она соответствовала:

public _translate(value: T, callback: (name: T) => void): void {
    if (!this.translate) {
      callback(value);
    }
}

и тогда вы сможете вызвать _translate() как метод для экземпляра вашего класса, например:

// class with _translate() method is MapperServiceArray<T>
const thingy = new MapperServiceArray<string>(); 

// call _translate on the object with a string and a callback that 
// takes a string and does not return a value
thingy._translate("something", x => console.info(x.charAt(0)));

Теперь, когда я вижу ваш фрагмент кода, я могу предлагать изменения, который заставит его скомпилировать (вроде), но я действительно не знаю, что вы пытаетесь сделать. Надеюсь, это немного помогло. Удачи.

И как это назвать?

dooglu 02.04.2018 15:36

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