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ů?
Mohu nastavit typ parametru jako jeden z mnoha typů Namísto jakéhokoli druhu na stroji?
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.
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 .
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!");
}
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
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;
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.













