2015-04-17 3 views
87

В настоящее время у меня есть определение типа, как:Машинопись: Как определить тип для функции обратного вызова (как любой тип функции, не универсальна есть), используемый в качестве параметра метода

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

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

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

, но 2-й не принимается.

ответ

98

Глобальный тип Function служит для этой цели.

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

+5

Эта вещь отсутствует в [основных типах] (https://www.typescriptlang.org/docs/handbook/basic-types.html) – Yogesh

+3

Это не базовый тип, потому что вы должны определить свои аргументы и вернуть значения. что-то вроде callback: (number: number) => void; гораздо полезнее для проверки типов, чем callback: function; было бы. – kpup

25

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

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

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

type CallbackFunction =() => void; 

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

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

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

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

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

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

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

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

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

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

9

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

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

Это действует машинопись, но это будет истолковано как ...

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

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

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

Смежные вопросы