さて、ErrorConstructor
の定義を見てみましょう:
interface ErrorConstructor {
new(message?: string): Error; // is a constructor
(message?: string): Error; // is callable
readonly prototype: Error; // has an Error prototype
}
、だから、ErrorConstructor
は任意の文字列引数を取るコンストラクタである必要があり、それはまた、関数として呼び出し可能にする必要がありますプロトタイプError
が必要です。さんがあなたのFooError
クラスを見てみましょう:
class FooError extends Error {
}
FooError.prototype; // okay, type FooError
new FooError("okay"); // okay
FooError("oops"); // error
それは、FooError
がError
のサブタイプであるので、大丈夫ですFooError
プロトタイプを、持っています。これはコンストラクタであり、ErrorConstructor
であるスーパークラスError
に委ねられているため、引数を受け入れます。しかし、関数として呼び出すことはできません。だからFooError
はErrorConstructor
ではありません。この時点で
、あなたはそれがErrorConstructor
あることについて、あなたが実際にケアかどうかを判断する必要があります。 new FooError('msg')
の代わりにFooError('msg')
と呼ぶ予定ですか?疑わしい。その点については、コンストラクタのprototype
はFooError
であることに気をつけますか?おそらくそうではありません。その場合はErrorConstructor
を使用しないでください。今、あなたのコードが動作する
interface NoFrillsErrorConstructor {
new(message?: string): Error;
}
:
const map = new Map<NoFrillsErrorConstructor, any> ([
[Error, 'do this'],
[FooError, 'do that']
])
そして、すべてが限り、同様となります代わりに、唯一のオプション-1-文字列引数のコンストラクターであることを気に以下のインターフェースを使用あなたはに準拠ケアについてFooError
を行う場合(
map.forEach((val, err) => {
err.prototype; // exists, but is type any. Who cares, right?
new err(); // okay
err(); // not okay
})
:あなただけのコンストラクタとしてマップのキーを使用します、それは手配することができますが、もう少し面倒です。あなたが私に詳細を教えてもらいたいかどうか教えてください。)
とにかく、助けてください。がんばろう!