Могу ли я задать параметр Тип в качестве одного из нескольких типов Вместо любого типа в машинописном?

голоса
9

В объявлении метода в машинописи, параметр может быть типа массив строк, булевы или цифр. Должен ли я объявить его как любое [] или есть способ ограничить тип входа, как на этих трех типов?

Задан 08/10/2012 в 07:50
источник пользователем
На других языках...                            


6 ответов

голоса
25

Машинопись 1,4 представил Типы Union поэтому ответ теперь да, вы можете .

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

Использование другого типа, чем те, указанные вызовет ошибку компиляции.


Если вы хотите массив нескольких конкретных типов, вы можете использовать союзные типы для этого, а также:

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

Обратите внимание, что это отличается от того, что спросил ОП для. Эти два примера имеют разные значения.

Ответил 28/08/2015 в 05:21
источник пользователем

голоса
7

Это кажется немного старый вопрос, но в любом случае, я наткнулся на него, и пропустил этот другой ответ, который я приношу.

Из машинопись 1.4 кажется, что можно объявить несколько возможных типов для параметра функции, как это:

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

Это происходит из-за новой машинопись концепции «ЮНИОН-типов».

Вы можете увидеть больше здесь .

Ответил 14/05/2015 в 09:56
источник пользователем

голоса
1

Номер машинопись поддерживает только один дополнительный 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!");
}
Ответил 08/10/2012 в 08:08
источник пользователем

голоса
1

Вы можете использовать перегруженные функции, чтобы сделать это:

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
Ответил 08/10/2012 в 08:07
источник пользователем

голоса
0

Другой способ решить эту проблему, чтобы найти общие методы и свойство между типами входными и объявить тип в линии в объявлении метода, который содержит этот общий Митос и свойство. Как это:

methodName(param1: { prop1: number; prop2: string; }, param2: { propA: bool; propB: string; } ): methodResultType;
Ответил 08/10/2012 в 08:21
источник пользователем

голоса
0

Так как строки, булевы и числа примитивных типов я не думаю, что есть простой способ. Если вы будете использовать набор различных типов объектов, вы могли бы, возможно, придумать супер класс, а затем указать, что суперкласс в интерфейсе вашего метода. С другой стороны, можно также использовать метод перегрузки для определения различных реализаций для массивов строк, булевы и целых чисел.

Ответил 08/10/2012 в 08:08
источник пользователем

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