Rozważmy następujący fragment (patrz również TS Playground):Zadzwoń new Date z Union Typ "numer | string"
var nr: number = 123456;
var str: string = "2015-01-01T12:00:00";
var both: number | string = 123456;
var myDate: Date;
myDate = new Date(nr);
myDate = new Date(str);
myDate = new Date(both); // <-- Compile error
To ostateczna linia daje błąd kompilatora:
Argument of type
number | string
is not assignable to parameter of type 'string'. Type 'number' is not assignable to type 'string'.
Jednakże, ponieważ istnieje konstruktor Date(...)
dla obu typów, które zakładam, że powyższe będzie działać.
mogę obejść ten problem, ponieważ nie ma innego konstruktora biorąc any
parametr:
myDate = new Date(<any> both);
ale co jeśli konstruktor nie było, na przykład czy ten scenariusz wystąpił w mojej własnej klasie?
Czy jest jakiś sposób, aby to działało poprawnie? Czy też typ związków ma tu charakterystyczny zapach, co oznacza, że moje definicje muszą zostać zmienione?
Sprawdziłem TS Handbook, ale nie ma sekcji o typach związków. Próbowałem go rozwiązać samodzielnie, ale nie pominąłem wyżej wspomnianej sztuczki <any>
. Przeszedłem przez sugerowane duplikaty i podobne pytania na temat SO, ale nie znalazłem na razie odpowiedzi.
To jest znakomita informacja, dziękuję. Zaakceptowałem drugą odpowiedź, ponieważ jest to rozwiązanie (/ workaround), którego użyłem, ale również +1 tutaj! – Jeroen
@Jeroen To ma dla mnie sens! Chociaż wydaje mi się, że dostarczyłem użytecznych/interesujących informacji, serial0ne bezpośrednio odpowiedział na pytanie w ten sposób. Dzięki za awans :) – AndyJ