2017-11-11 70 views
2

我有下面的代碼:如何重用函數簽名定義打字稿

class A { 
    constructor(public n: number) {} 

    defaultFn(a: number): number { 
    return a + 1; 
    } 

    doStuff(callback?): number { 
    return callback ? callback(this.n) : this.defaultFn(this.n); 
    } 
} 

我怎麼能告訴打字稿的可選callback功能傳遞給doStuff方法應該具有相同的簽名defaultFn方法?

+0

https://stackoverflow.com/questions/13137350/defining-typescript-callback-鍵入 – Slai

回答

2
interface Callback { 
    (n:number):number; 
} 

class A { 
    constructor(public n: number) { } 

    public readonly defaultFn: Callback = (a: number): number => { 
     return a + 1; 
    } 

    public doStuff(callback?: Callback): number { 
     return callback ? callback(this.n) : this.defaultFn(this.n); 
    } 
} 

你也可以簡單地做到這一點

doStuff(callback?: (n:number)=>number): number { 
    return callback ? callback(this.n) : this.defaultFn(this.n); 
} 

或與接口

interface Callback { 
    (n:number):number; 
} 

doStuff(callback?: Callback): number { 
    return callback ? callback(this.n) : this.defaultFn(this.n); 
} 
+0

謝謝!有一個問題 - 我是否必須重複'defaultFn'的類型定義?你寫了'defaultFn:Callback =(a:number):number' - 指定'Callback'和'(a:number):number'是不是多餘的?如果我將參數名稱形式'a'重命名爲'n',它可以簡化,因爲它是在'Callback'接口中聲明的? – szimek

+0

@szimek噢,你肯定可以刪除類型規範,只是把它變成類方法而不是字段。重命名這個參數並不會有任何不同,它只是一個參數的名字,沒什麼其他的。 – smac89

+0

@szimek我使用這個類型的原因是爲了讓讀者更加明白'defaultFn'與回調類型相同,也減少了編譯時間。這是靜態打字的美妙之處。 – smac89

1

還有一個選項是 「查詢」 型的defaultFn結合起來。在這種情況下,你將不再需要手工維護回調的類型:

class A { 
    constructor(public n: number) {} 

    defaultFn(a: number): number { 
     return a + 1; 
    } 

    doStuff(callback?: A['defaultFn']): number { 
     return callback ? callback(this.n) : this.defaultFn(this.n); 
    } 
} 

A['deafultFn']結果是(a: number) => number