Mogę określić parametr typu jako jednym z wielu rodzajów Zamiast dowolnego typu na maszynie?

głosy
9

W zgłoszeniu metody maszynowo parametr może być typu tablicy ciągów logicznych, lub cyfr. Czy muszę deklarować go jak każdy [] lub czy jest jakiś sposób, aby ograniczyć typ wejścia jak na tych trzech typów?

Utwórz 08/10/2012 o 07:50
źródło użytkownik
W innych językach...                            


6 odpowiedzi

głosy
25

Maszynopis 1.4 wprowadzono Rodzaje Unii więc odpowiedź jest teraz tak, można .

function myFunc(param: string[] | boolean[] | number[]): void;

Używanie innego typu niż określone spowoduje błąd kompilacji.


Jeśli chcesz tablicę wielu konkretnych typów, można użyć Rodzaje Unii, że dobrze:

function myFunc(param: (string|boolean|number)[]): void;

Zauważ, że jest inny od tego, co PO poprosił. Te dwa przykłady mają różne znaczenia.

Odpowiedział 28/08/2015 o 05:21
źródło użytkownik

głosy
7

To wydaje się trochę stare pytanie, ale tak czy owak, natknąłem się na niego, a brakowało tej innej odpowiedzi, że przyniesie.

Od maszynopis 1.4 Wydaje się, że możliwe jest, aby zadeklarować kilka możliwych rodzajów dla parametru funkcji takich jak to:

class UtilsClass {
    selectDom(element: string | HTMLElement):Array<HTMLElement> {
        //Here will come the "magic-logic"
    }
}

To właśnie z powodu nowej koncepcji maszynopis „Unii typów”.

Można zobaczyć więcej tutaj .

Odpowiedział 14/05/2015 o 09:56
źródło użytkownik

głosy
1

Nie maszynopis obsługuje tylko jeden opcjonalny TypeAnnotation pomocą parametru, np x: string, numeru lub w ogóle, więc nie można stwierdzić, zestaw dozwolonych typów.

Jednak maszynopis obsługuje przeciążeń funkcyjnych (dokumentacja P51):

przeciążenia funkcyjne pozwalają na dokładniejsze określenie wzorców wywołania obsługiwanego przez funkcję niż jest to możliwe za pomocą jednego podpisu. [...]

    function attr(name: string): string;
    function attr(name: string, value: string): Accessor;
    function attr(map: any): Accessor;
    function attr(nameOrMap: any, value: string): any {
        if (nameOrMap && typeof nameOrMap === "object") {
            // handle map case
        }
        else {
            // handle string case
        }
    }

Otherwsie można użyć typeofkontrole typu, ale ten przeciwdziała ascpect typu dla typów Script trochę.

function myFunc(x){
    if(typeof x !== "string" && typeof x !== "object" && typeof x !== "number")
        throw new TypeError("Unsupported type!");
}
Odpowiedział 08/10/2012 o 08:08
źródło użytkownik

głosy
1

Można użyć funkcji przeciążeń, aby to zrobić:

class Thing {
    public foo(x: number[]);
    public foo(x: bool[]);
    public foo(x: string[]);
    public foo(x: any[]) {
       // Note: You'll have to do type checking on 'x' manually
       // here if you want differing behavior based on type
    }
}

// Later...
var t = new Thing();
t.foo(someArray); // Note: External callers will not see the any[] signature
Odpowiedział 08/10/2012 o 08:07
źródło użytkownik

głosy
0

Innym sposobem rozwiązania tego problemu jest znalezienie wspólnych metod i właściwości między typami wejściowych i zadeklarować typu in-line w deklaracji metody, która posiada te wspólne Methos i właściwości. Lubię to:

methodName(param1: { prop1: number; prop2: string; }, param2: { propA: bool; propB: string; } ): methodResultType;
Odpowiedział 08/10/2012 o 08:21
źródło użytkownik

głosy
0

Ponieważ ciągi, wartości logiczne i numery są prymitywne typy nie sądzę, jest to prosty sposób. Jeśli chcesz użyć zestawu różnych typów obiektów, mógłbyś może pochodzić z super klasy, a następnie określić, że super klasy w interfejsie swojej metody. Z drugiej strony, można również użyć metody przeciążania określić różne implementacje dla tablic ciągów logicznych i liczb.

Odpowiedział 08/10/2012 o 08:08
źródło użytkownik

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more