2016-07-22 91 views
0

比方說,我在TypeScript中創建一個容器。它可以是任何容器,但我會用下面這個簡單的例子:是否可以爲特定方法約束泛型類?

class Container<T> { 
    val: T; 
    constructor(t: T) { 
    this.val = t; 
    } 
} 

說我想提供一個功能,因此,如果我有兩個容器與數字,我可以很容易地創建一個新的容器這些數字加在一起。

class Container<T> { 
    val: T; 
    constructor(t: T) { 
    this.val = t; 
    } 
    add(c: Container<number>): Container<number> { 
    return new Container(this.val + c.val); 
    } 
} 

但是我不明白是否有可能做出上述代碼類型檢查。問題是,我所知道的關於this.val的是它的類型是T(這是什麼)。我想以某種方式約束add方法,使其只能在的地方Container<T>實例T == number被調用。在TypeScript中可能嗎?

上面的僅僅是一個人爲的例子。我真正想要做的是爲應用函數創建一個TypeScript接口。一個適用函數,對於Container應該是這樣的方法:

ap<A, B>(c: Container<A>): Container<B> { 
    return new Container(this.val(c.val)); 
} 

因此,在這種情況下,我必須知道T == (a: A) => B。更一般地說,我希望能夠定義這個接口:

interface Applicative<T> { 
    ... 
    ap: <A, B>(a: Applicative<A>) => Applicative<B> // where T == (a: A) => B 
    ... 
} 

這是可能的嗎?

+1

有,看看手冊https://www.typescriptlang.org/docs/handbook/generics.html#generic-constraints – toskv

+0

我讀過的文檔。但它只顯示如何將通用約束添加到函數。據我所知,這並不能解決我的問題。 – paldepind

+0

對於單一方法來說,限制t是不可能的。 – toskv

回答

1

你不能對於適用於單一方法的T有限制。你只能在課堂上擁有他們。

0

您可以添加約束泛型類型。

在你的情況,你可以做這樣的事情:

interface HasNumber { 
    x: number; 
} 

class Container<T extends HasNumber> { 
} 

但你不能使用基本類型,如數字,字符串,布爾約束...

+0

這不是我想要的。我不想爲整個班級限制'T'。我希望'Container'能夠適用於所有類型,但是對於一種特定的方法,只有當'T'滿足約束條件時才能工作。 – paldepind

+0

您可以製作一個通用的方法。像這樣myMethod (x:T){....} – vintem

相關問題