2016-09-16 2 views
0

Только начиная с машинопись, и используя интерфейсы для выполнения своих функций, например, так:TypeScript: добавить интерфейс к названной функции?

interface StringFunction { 
    (arg1:string):string 
} 

Я могу прикрепить этот интерфейс к функции, если я объявляю его как переменная:

let testFunction:StringFunction = function(arg1) {} 

но I не может решить, как я (или могу?) сделать это с помощью именованной функции. Это не работает:

function testFunction:StringFunction(arg1) {} 

есть ли способ сделать это?

+0

Интерфейсы AFAIK в TypeScript больше похожи на интерфейс на C# или Java - он определяет API-интерфейс объекта, поэтому StringFunction не является именем функции, ее интерфейсом вы можете реализовать. Другими словами, если бы у вас был интерфейс 'StringFunction' с функцией, принимающей строку a1, вы бы не назвали ее так:' StringFunction (arg1) ', но вам нужно было бы создать экземпляр класса, который реализует интерфейс StringFunction, а затем:' obj.func (arg1) ' –

+0

Насколько я могу судить, TypeScript просто не имеет синтаксиса, который позволяет вам указать интерфейс для именованной функции, подобной этой. Есть ли причина, по которой вы не можете придерживаться синтаксиса 'let testFunction: StringFunction = ...'? – smarx

ответ

1

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

Например, testFunction ниже вполне приемлемо, где требуется StringFunction - и компилятор проверяет, что это такое.

interface StringFunction { 
    (arg1:string):string 
} 

function testFunction(arg1) { return ''; } 

var x: StringFunction = testFunction; 

Следующий пример чтобы проиллюстрировать, что проверка типа происходит:

interface StringFunction { 
    (arg1:string):string 
} 

function testFunction(arg1) { return 1; } 

var x: StringFunction = testFunction; // Error 

В этом случае testFunction не совместим, и компилятор выдает предупреждение.