2016-11-18 51 views
1

月底所以,我正在學習打字稿,但我找不到這些參數是如何工作的打字稿參數:在任何一個字符串參數

interface MyInterface { 
    (name?: string): any; 
    new (name?: string): any; 
} 

class MyClass implements MyInterface { 
    (name?: string): any; // This is not working 
} 

我understend什麼:名稱應該是一個字符串參數,不是強制性的

什麼我不下線:如何outisde'任何'的作品?和什麼「新」的名字的意思是

來源:角核心文檔OutputDecorator: https://github.com/angular/angular/blob/master/modules/%40angular/core/src/metadata/directives.ts#L836

+0

該接口似乎描述了一個函數,它接受一個字符串並返回任何東西(那是什麼:任何部分的意思)。但它也必須是一個可以通過構造函數初始化的類(新的部分)。通過單獨的打字稿很難完成,但有js結構可以匹配它。 – toskv

回答

0

這些都是調用簽名構建簽名。具有類型MyInterface

任何爲你定義它可以

  • 調用,任選一個string說法。
  • 構造(new -ed),可選地帶有string參數。

在兩種情況下,主叫或new -ing一個MyInterface將導致any類型的值。


作爲該:

class MyClass implements MyInterface { 
    (name?: string): any; // This is not working 
} 

呼叫或構建簽名只能出現在一個TypeBody按照the TypeScript spec。類型主體僅用於對象類型文字和interface declarations。這與不允許調用/構造簽名的ClassBody略有不同。

在一類,可以代替定義構造函數:

class C { 
    constructor() { 
     console.log("Hi"); 
    } 
} 

但有沒有辦法讓一個類調用。

請注意,執行一些調用和構造簽名意味着實例將獲得類型,而不是靜態的一面。換句話說,你在說MyClass產生的東西將與MyInterface兼容,但是與MyClass本身的靜態形狀沒有任何關係。

沒有辦法,保證了靜態側具有一定的形狀,現在除了像這樣黑客:

class MyClass { 
    // ... 
} 

if (!!false) { 
    let x: MyInterface = MyClass; 
}