Mohu nastavit typ parametru jako jeden z mnoha typů Namísto jakéhokoli druhu na stroji?

hlasů
9

Ve způsobu prohlášení na psacím stroji, parametr může být typu pole řetězců, booleans nebo čísla. Musím prohlásit ho jako každý [] nebo je tam způsob, jak omezit typ vstupu i na těchto tří typů?

Položena 08/10/2012 v 07:50
zdroj uživatelem
V jiných jazycích...                            


6 odpovědí

hlasů
25

Strojopisem 1.4 představil Druhy Unie takže odpověď je nyní ano, můžete .

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

Použitím jiného typu, než těch specifikovaných vyvolá chybu v době kompilace.


Pokud chcete celou řadu různých specifických typů, můžete použít Typy Unie v oblasti, která stejně:

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

Všimněte si, že toto je odlišné od toho, co požádal o OP. Tyto dva příklady mají různé významy.

Odpovězeno 28/08/2015 v 05:21
zdroj uživatelem

hlasů
7

To se zdá být trochu starou otázku, ale tak jako tak, jsem narazil na ní, a minul tuto jinou odpověď, že jsem se přinést.

Od strojopisem 1.4 Zdá se, že je možné deklarovat více možných typů pro parametr funkce, jako je tento:

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

Důvodem je, že nové strojopisu pojmu „Unie typy“.

Můžete vidět více zde .

Odpovězeno 14/05/2015 v 09:56
zdroj uživatelem

hlasů
1

Ne strojopisem podporuje pouze jeden volitelný TypeAnnotation v parametru, například x: string, číslo nebo jakýkoli, takže není možné uvést sadu povolených typů.

Nicméně, strojopisem podporuje funkci přetížení (dokumentace P51):

Funkce přetížení umožňují přesnější specifikaci vzory vyvolání podporovaných funkcí, než je možné s jediným podpisem. [...]

    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 můžete použít typeofkontroly typu, ale to pulty typ společenský aspekt typu Script trochu.

function myFunc(x){
    if(typeof x !== "string" && typeof x !== "object" && typeof x !== "number")
        throw new TypeError("Unsupported type!");
}
Odpovězeno 08/10/2012 v 08:08
zdroj uživatelem

hlasů
1

Můžete použít funkce přetížení, jak to udělat:

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
Odpovězeno 08/10/2012 v 08:07
zdroj uživatelem

hlasů
0

Dalším způsobem, jak vyřešit tento problém je najít společné metody a vlastnosti, mezi typy vstupních a deklarovat in-line typ v deklaraci metody, která je držitelem těchto společných Methos a vlastnosti. Takhle:

methodName(param1: { prop1: number; prop2: string; }, param2: { propA: bool; propB: string; } ): methodResultType;
Odpovězeno 08/10/2012 v 08:21
zdroj uživatelem

hlasů
0

Vzhledem k tomu, struny, Booleans a čísla jsou primitivní typy Nemyslím si, že existuje jednoduchý způsob. Máte-li zájem použít sadu různých typů objektů, mohli byste možná přijít s super třídě a poté určit, že super-třídu v rozhraní metodu. Na druhou stranu, můžete také použít metodu přetížení zadat různé implementace pro pole řetězců, booleans a celých čísel.

Odpovězeno 08/10/2012 v 08:08
zdroj uživatelem

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