2017-04-24 176 views
0

說我想和喜歡的接口標記功能必需的屬性:打字稿:聲明函數與功能

interface TaggedFun { 
    (args): void; 
    tag: boolean; 
} 

看來它不能夠實際申報匹配這個簽名的函數(如任何函數文字將會丟失所需的tag屬性);

唯一的選擇是使tag成爲可選項,並記住之後爲其分配一個值。

是否有任何方法來保持這種類型安全(即在類型中的標籤要求)?

回答

1

您可以在一個工廠函數創建TaggedFun實例:

interface TaggedFun { 
    (): void; 
    tag: boolean; 
} 

function taggedFactory(tag: boolean, fn?:() => void): TaggedFun { 
    let tagged = (fn || function() { 
     // function body here 
    }) as TaggedFun; 

    tagged.tag = tag; 
    return tagged; 
} 

這樣,你總是知道你有tag屬性(如果您創建使用工廠的實例),你會得到類型安全。
例如:

function doSomething(tagged: TaggedFun) {} 

doSomething(() => { }); // error 
doSomething(taggedFactory(true)); // ok 
doSomething(taggedFactory(true,() => { })); // ok 

code in playground

0

不是一個乾淨的方式,它的方式就像你說的那樣。

這是爲了支持老式的JavaScript,而不是類,你會得到具有額外屬性的函數。

我會敦促你考慮使用類。

+0

這必須是一個功能和打字稿似乎不喜歡靶向ES5延伸時的功能。但是,我想看看我是否可以在構造函數中完成這項工作.... –