Sekcja 6.3 specyfikacji języka TypeScript mówi o przeciążeniu funkcji i podaje konkretne przykłady, jak to zaimplementować. Jeśli jednak spróbuję czegoś takiego:
export class LayerFactory {
constructor (public styleFactory: Symbology.StyleFactory) { }
createFeatureLayer (userContext : Model.UserContext, mapWrapperObj : MapWrapperBase) : any {
throw "not implemented";
}
createFeatureLayer(layerName : string, style : any) : any {
throw "not implemented";
}
}
Otrzymuję błąd kompilatora wskazujący na duplikat identyfikatora, mimo że parametry funkcji są różnych typów. Nawet jeśli dodam dodatkowy parametr do drugiej funkcji createFeatureLayer, nadal pojawia się błąd kompilatora. Proszę o pomysły.
typescript
overloading
Klaus Nji
źródło
źródło
Odpowiedzi:
Może to być spowodowane tym, że gdy obie funkcje są skompilowane w JavaScript, ich podpis jest całkowicie identyczny. Ponieważ JavaScript nie ma typów, w efekcie tworzymy dwie funkcje, biorąc tę samą liczbę argumentów. Tak więc TypeScript ogranicza nas do tworzenia takich funkcji.
TypeScript obsługuje przeciążanie w oparciu o liczbę parametrów, ale kroki, które należy wykonać, są nieco inne, jeśli porównamy je z językami OO. W odpowiedzi na inne pytanie SO ktoś wyjaśnił to dobrym przykładem: Przeciążenie metody? .
Zasadniczo tworzymy tylko jedną funkcję i szereg deklaracji, aby TypeScript nie dawał błędów kompilacji. Po skompilowaniu tego kodu do JavaScript widoczna będzie tylko konkretna funkcja. Ponieważ funkcja JavaScript może być wywołana przez przekazanie wielu argumentów, po prostu działa.
źródło
type
s, wyliczenia, generyczne itp., Giną w czasie wykonywania. Dlatego też nie możesz tego zrobićsomeObject instanceof ISomeInterfaceDefinedInTypeScript
.Kiedy przeciążasz się w TypeScript, masz tylko jedną implementację z wieloma podpisami.
Tylko trzy przeciążenia są rozpoznawane przez TypeScript jako możliwe sygnatury wywołania metody, a nie rzeczywista implementacja.
W twoim przypadku osobiście użyłbym dwóch metod o różnych nazwach, ponieważ parametry są niewystarczające, co sprawia, że ciało metody będzie musiało mieć wiele „ifs”, aby zdecydować, co robić.
TypeScript 1.4
Począwszy od TypeScript 1.4, zazwyczaj można usunąć potrzebę przeciążenia za pomocą typu unii. Powyższy przykład można lepiej wyrazić za pomocą:
Typ
a
to „albostring
albonumber
”.źródło
class Foo { constructor(obj) { } constructor (a: number, b: string, c: boolean) {} }
Foo.fromObject(obj)
aFoo.fromJson(str)
i tak dalej.Foo.methos(1, 2, 3)
Foo.method(1)
Foo.method(Obj)
Zauważyłem również, że masz różne metody wFoo
klasie, fromObject i fromJson?myNum
lubmyObj
tak, więc dlaczego nie mieć osobnych metod i wszystko wyjaśnić / uniknąć niepotrzebnej logiki rozgałęziania.Możesz zadeklarować przeciążoną funkcję, deklarując, że ma ona typ, który ma wiele sygnatur wywołania:
Następnie:
Rzeczywista definicja funkcji musi być pojedyncza i odpowiednio wykonywać wewnętrzną dyspozycję na podstawie jej argumentów.
Na przykład za pomocą klasy (która może zaimplementować
IFoo
, ale nie musi):Interesujące jest to, że
any
formularz jest ukryty przez bardziej szczegółowo nadpisane zmiany.źródło
Co to jest przeciążenie funkcji w ogóle?
Co to jest przeciążenie funkcji w JS?
Ta funkcja nie jest możliwa w JS - ostatnia zdefiniowana funkcja jest przyjmowana w przypadku wielu deklaracji:
... i w TS?
Przeciążenia to konstrukcja czasu kompilacji, która nie ma wpływu na środowisko wykonawcze JS:
W przypadku użycia powyższego kodu (bezpieczniejszego niż JS) wyzwalany jest duplikat błędu implementacji. TS wybiera pierwsze dopasowanie przeciążenia w kolejności od góry, więc przeciążenia są sortowane od najbardziej specyficznych do najbardziej rozległych.
Przeciążenie metody w TS: bardziej złożony przykład
Typy metod klas przeciążonych mogą być używane w podobny sposób jak przeciążanie funkcji:
Możliwe są bardzo różne przeciążenia, ponieważ implementacja funkcji jest kompatybilna ze wszystkimi sygnaturami przeciążenia - wymuszonymi przez kompilator.
Więcej informacji:
źródło
Jako head-up do innych, zauważyłem, że przynajmniej tak jak manifestuje się TypeScript skompilowany przez WebPack dla Angulara 2, po cichu dostajesz overWRITTEN zamiast przepełnionych metod.
Powołanie:
wydaje się wykonywać metodę z argumentami, dyskretnie ignorując wersję bez argonu, z wyjściem:
źródło
Duplicate function implementation
ostrzeżenie dla takiego kodu.Przeciążenie funkcji w maszynopisie:
Według Wikipedii (i wielu książek o programowaniu) definicja przeciążenia metody / funkcji jest następująca:
W maszynopisie nie możemy mieć różnych implementacji tej samej funkcji, które są wywoływane zgodnie z liczbą i typem argumentów. Wynika to z faktu, że po kompilacji TS do JS funkcje w JS mają następujące cechy:
Dlatego w ścisłym znaczeniu można argumentować, że przeciążenie funkcji TS nie istnieje. Są jednak rzeczy, które możesz zrobić w kodzie TS, które mogą doskonale naśladować przeciążenie funkcji.
Oto przykład:
Dokumenty TS nazywają tę metodę przeciążeniem, a my w zasadzie dostarczyliśmy wiele sygnatur metod (opisy możliwych parametrów i typów) do kompilatora TS. Teraz TS może dowiedzieć się, czy poprawnie wywołaliśmy naszą funkcję w czasie kompilacji, a jeśli wystąpiliśmy niepoprawnie, wywołaliśmy błąd.
źródło