2016-07-22 7 views
0

たとえば、TypeScriptでコンテナを作成します。これは、任意のコンテナかもしれないが、私は次の簡単な例を使用します:特定のメソッドの汎用クラスを制約できますか?

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

は、私が番号を持つ2個のコンテナを持っている場合、私は簡単で新しいコンテナを作成できるように、私は機能を提供したいと言いますそれらの数字は一緒に追加されました。

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インターフェイスを作成することです。

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

したがって、この場合には、私はT == (a: A) => Bことを知っている必要があります:応用的機能はContainerのために、このようになります方法があります。より一般的には、このインターフェースを定義できるようにしたいと考えています:

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

1つのメソッドに対してtを制約することはできません。 – toskv

答えて

1

あなたがすることはできません単一の方法に適用されるTの制限があります。あなたはクラスレベルでしかそれらを持つことができません。

0

ジェネリック型に制約を追加できます。あなたのケースでは

あなたはこのような何か行うことができます:

interface HasNumber { 
    x: number; 
} 

class Container<T extends HasNumber> { 
} 

をしかし、あなたは、このような数値、文字列、ブール値などの基本的なタイプを使用して制約を持つことができません...

+0

それは私が望むものではありません。私はクラス全体で 'T'を制約したくありません。私は 'Container'をすべての型に対して動作させたいが、' T'が制約を満たすときにのみ動作する特定のメソッドについては、 – paldepind

+0

単一のメソッドを汎用にすることができます。次のようにmyMethod (x:T){....} – vintem

関連する問題