一般に関数のオーバーロードとは何ですか?
関数のオーバーロードやメソッドのオーバーロードを作成する機能である複数の関数の同じ名前を持つ異なる実装を(ウィキペディア)
JSでの関数のオーバーロードとは何ですか?
JSではこの機能は使用できません。複数の宣言がある場合、最後に定義された関数が使用されます。
function foo(a1, a2) { return `${a1}, ${a2}` }
function foo(a1) { return `${a1}` } // replaces above `foo` declaration
foo(42, "foo") // "42"
...そしてTSでは?
オーバーロードは、JSランタイムに影響を与えないコンパイル時の構造です。
function foo(s: string): string // overload #1 of foo
function foo(s: string, n: number): number // overload #2 of foo
function foo(s: string, n?: number): string | number {/* ... */} // foo implementation
上記のコード(JSより安全)を使用すると、重複した実装エラーがトリガーされます。TSは最初のフィッティングオーバーロードをトップダウンの順序で選択するため、オーバーロードは最も固有のものから最も広いものへと並べ替えられます。
TSでのメソッドのオーバーロード:より複雑な例
オーバーロードされたクラスメソッドタイプは、関数のオーバーロードと同様の方法で使用できます。
class LayerFactory {
createFeatureLayer(a1: string, a2: number): string
createFeatureLayer(a1: number, a2: boolean, a3: string): number
createFeatureLayer(a1: string | number, a2: number | boolean, a3?: string)
: number | string { /*... your implementation*/ }
}
const fact = new LayerFactory()
fact.createFeatureLayer("foo", 42) // string
fact.createFeatureLayer(3, true, "bar") // number
関数の実装は、コンパイラーによって適用されるすべてのオーバーロードシグネチャと互換性があるため、非常に異なるオーバーロードが可能です。
詳細: