2016-05-26 13 views
1

私はかなりタイプミスを慣れているので、愚かなことをしているだけかもしれませんが、バグや制限のようなものが見つかりました。私はFooを取る関数のためのインターフェイスを定義しました。その関数を別の関数に渡すと、渡す関数はanyFooとする必要があります。しかし、私がclass Bar extends Fooと定義し、次にを受け取ったのですが、Fooではなく、Fooの関数を必要とする関数に渡すことができます。例:TypeScriptの下限パラメータ

class Foo { 

} 

class Bar extends Foo { 

} 

interface TakesAnyFoo { 
    (x: Foo) : void; 
} 

function needsAFunctionThatTakesAnyFoo(f: TakesAnyFoo) { 
    let foo = new Foo(); 
    f(foo); 
} 

function takesOnlyABar(x: Bar) { 
    console.log(`I got ${x}`); 
} 

needsAFunctionThatTakesAnyFoo(takesOnlyABar); 

ここで私が必要とするのは、Javaの下限タイプと同等です。次のようなものがあります。

interface TakesAnyFoo<T super Foo> { 
    (x: T) : void; 
} 

ただし、Typescriptにはこれが含まれていません。 needsAFunctionThatTakesAnyFooに渡された関数が入力としてFooを受け入れなければならないという制約をどのように強制することができますか?我々が持っているあなたのコードの簡素化

答えて

1

class Foo { 
} 

class Bar extends Foo { 
} 

function needsAFunctionThatTakesAnyFoo(f: (x: Foo) => void) { 
    let foo = new Foo(); 
    f(foo); 
} 

needsAFunctionThatTakesAnyFoo((x: Bar) => { }); 

は、これは、イベントハンドラに共通のパターンを許可するようにサポートされています。例えばMouseEventを、Eventのみをサポートするイベント仕様に変換する関数を提供します。

よりこれはここに覆われている:

https://github.com/Microsoft/TypeScript-Handbook/blob/master/pages/Type%20Compatibility.md#comparing-two-functions

+0

感謝を。デザイン意思決定には失望しますが、それはあなたのせいではありません。 –

関連する問題