Подтвердить что ты не робот

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

В настоящее время у меня есть определение типа как:

interface Param {
    title: string;
    callback: any;
}

Мне нужно что-то вроде:

interface Param {
    title: string;
    callback: function;
}

но второй не принимается.

4b9b3361

Ответ 1

Для этого служит глобальный тип Function.

Кроме того, если вы намереваетесь вызывать этот обратный вызов с помощью 0 аргументов и игнорируете его возвращаемое значение, тип () => void соответствует всем функциям без аргументов.

Ответ 2

Typescript из v1.4 имеет ключевое слово type, которое объявляет псевдоним типа (аналогичный typedef в C/С++). Вы можете объявить свой тип обратного вызова таким образом:

type CallbackFunction = () => void;

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

type CallbackFunctionVariadic = (...args: any[]) => void;

Тогда вы можете сказать, например,

let callback: CallbackFunctionVariadic = function(...args: any[]) {
  // do some stuff
};

Если вам нужна функция, которая принимает произвольное количество аргументов и возвращает что-либо (включая void):

type CallbackFunctionVariadicAnyReturn = (...args: any[]) => any;

Вы можете указать некоторые обязательные аргументы, а затем набор дополнительных аргументов (например, строку, число и затем набор дополнительных аргументов):

type CallbackFunctionSomeVariadic =
  (arg1: string, arg2: number, ...args: any[]) => void;

Это может быть полезно для таких вещей, как обработчики EventEmitter.

Функции могут быть набраны так сильно, как вам нравится, таким образом, хотя вы можете увлечься и столкнуться с комбинаторными проблемами, если попытаетесь прибить все с помощью псевдонима типа.

Ответ 3

Следуя ответам Райана, я думаю, что интерфейс, который вы ищете, определяется следующим образом:

interface Param {
    title: string;
    callback: () => void;
}

Ответ 4

Вот пример функции, которая принимает обратный вызов

const sqk = (x: number, callback: ((_: number) => number)): number => {
  // callback will receive a number and expected to return a number
  return callback (x * x);
}

// here our callback will receive a number
sqk(5, function(x) {
  console.log(x); // 25
  return x;       // we must return a number here
});

Если вам не нужны возвращаемые значения обратных вызовов (большинство людей не знают, как их использовать любым эффективным способом), вы можете использовать void

const sqk = (x: number, callback: ((_: number) => void)): void => {
  // callback will receive a number, we don't care what it returns
  callback (x * x);
}

// here our callback will receive a number
sqk(5, function(x) {
  console.log(x); // 25
  // void
});

Обратите внимание, что подпись, которую я использовал для параметра callback...

const sqk = (x: number, callback: ((_: number) => number)): number

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

Однако, если вы это сделаете

// danger!! don't do this
const sqk = (x: number, callback: ((number) => number)): number

Он действителен TypeScript, но будет интерпретироваться как...

// watch out! typescript will think it means ...
const sqk = (x: number, callback: ((number: any) => number)): number

Т.е., TypeScript будет считать, что имя параметра number, а подразумеваемый тип - any. Это явно не то, что мы намеревались, но, увы, так работает TypeScript.

Поэтому не забудьте указать имена параметров при наборе параметров функции... как бы это ни было глупо.

Ответ 5

Вы можете определить тип функции в интерфейсе различными способами,

  1. общий способ:
export interface IParam {
  title: string;
  callback(arg1: number, arg2: number): number;
}
  1. Если вы хотите использовать синтаксис свойства тогда,
export interface IParam {
  title: string;
  callback: (arg1: number, arg2: number) => number;
}
  1. Если вы сначала объявите тип функции,
type MyFnType = (arg1: number, arg2: number) => number;

export interface IParam {
  title: string;
  callback: MyFnType;
}

Использование очень просто,

function callingFn(paramInfo: IParam):number {
    let needToCall = true;
    let result = 0;
   if(needToCall){
     result = paramInfo.callback(1,2);
    }

    return result;
}
  1. Вы также можете объявить литерал типа функции, что означает, что функция может принимать другую функцию в качестве параметра. Функция параметризации также может быть вызвана как обратный вызов.
export interface IParam{
  title: string;
  callback(lateCallFn?:
             (arg1:number,arg2:number)=>number):number;

}

Ответ 6

interface Param {
   title: string;
   callback: () => void;
}