В объявлении метода в машинописи, параметр может быть типа массив строк, булевы или цифр. Должен ли я объявить его как любое [] или есть способ ограничить тип входа, как на этих трех типов?
Могу ли я задать параметр Тип в качестве одного из нескольких типов Вместо любого типа в машинописном?
Машинопись 1,4 представил Типы Union поэтому ответ теперь да, вы можете .
function myFunc(param: string[] | boolean[] | number[]): void;
Использование другого типа, чем те, указанные вызовет ошибку компиляции.
Если вы хотите массив нескольких конкретных типов, вы можете использовать союзные типы для этого, а также:
function myFunc(param: (string|boolean|number)[]): void;
Обратите внимание, что это отличается от того, что спросил ОП для. Эти два примера имеют разные значения.
Это кажется немного старый вопрос, но в любом случае, я наткнулся на него, и пропустил этот другой ответ, который я приношу.
Из машинопись 1.4 кажется, что можно объявить несколько возможных типов для параметра функции, как это:
class UtilsClass {
selectDom(element: string | HTMLElement):Array<HTMLElement> {
//Here will come the "magic-logic"
}
}
Это происходит из-за новой машинопись концепции «ЮНИОН-типов».
Вы можете увидеть больше здесь .
Номер машинопись поддерживает только один дополнительный TypeAnnotation в качестве параметра, например x: string, номер или любой, так что вы не можете сформулировать набор допустимых типов.
Тем не менее, машинопись поддерживает перегруженные функции (документация P51):
Функциональные перегрузки позволяют более точную спецификацию моделей вызова поддерживается функцией, чем это возможно с одной подписью. [...]
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 вы можете использовать typeofпроверки типов, но это счетчики типа ascpect из типа Script немного.
function myFunc(x){
if(typeof x !== "string" && typeof x !== "object" && typeof x !== "number")
throw new TypeError("Unsupported type!");
}
Вы можете использовать перегруженные функции, чтобы сделать это:
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
Другой способ решить эту проблему, чтобы найти общие методы и свойство между типами входными и объявить тип в линии в объявлении метода, который содержит этот общий Митос и свойство. Как это:
methodName(param1: { prop1: number; prop2: string; }, param2: { propA: bool; propB: string; } ): methodResultType;
Так как строки, булевы и числа примитивных типов я не думаю, что есть простой способ. Если вы будете использовать набор различных типов объектов, вы могли бы, возможно, придумать супер класс, а затем указать, что суперкласс в интерфейсе вашего метода. С другой стороны, можно также использовать метод перегрузки для определения различных реализаций для массивов строк, булевы и целых чисел.













