2016-09-16 40 views
0

剛剛開始接觸打字稿,以及使用接口,我的功能,像這樣:TypeScript:將接口添加到命名函數?

interface StringFunction { 
    (arg1:string):string 
} 

我該接口連接到一個函數,如果我宣佈它作爲一個變量:

let testFunction:StringFunction = function(arg1) {} 

,但我不能解決我如何(或可以)用一個命名函數來做到這一點。這是行不通的:

function testFunction:StringFunction(arg1) {} 

有沒有辦法做到這一點?

+0

TypeScript中的AFAIK接口更像是C#或Java中的接口 - 它定義了對象API,因此StringFunction不是函數名稱,它是您可以實現的接口。換句話說,如果你的函數接口StringFunction的函數是字符串a1,你不會像這樣調用它:'StringFunction(arg1)',但是你必須實例化一個實現了StringFunction接口的類,然後:' obj.func(arg1)' –

+0

據我所知,TypeScript只是沒有一個語法允許你指定一個像這樣的命名函數的接口。有沒有理由不能堅持'let testFunction:StringFunction = ...'語法? – smarx

回答

1

需要明確說明正在使用哪個接口是名義類型系統的約束。 TypeScript是結構類型化的,所以你不需要明確聲明你的函數實現了接口。

例如,當需要StringFunction時,下面的testFunction是完全可以接受的 - 並且編譯器檢查它是否是。

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不兼容並且編譯器將發出警告。