Как получить неявную типизацию возвращаемых функций в TypeScript?

Я экспериментирую с машинописным текстом и пытаюсь создать функцию using(...), которая в основном является IIFE, но с аргументами первыми, а не последними.

var someValue = (function (p0, p1) {
    // p0 is someGlobal
    // p1 is someOtherGlobal

    // do stuff with in scope

    return /*something*/;
}(someGlobal, someOtherGlobal));

Выше приведен общий IIFE с возвращаемым значением. Опять же, я просто экспериментирую здесь, но я думаю, что это было бы более читабельно, если бы сначала аргументы IIFE, а затем функция, например.

const someValue = using([someGlobal, someOtherGlobal], /*as*/ (p0, p1) => {
    // p0 is someGlobal p1 is someOtherGlobal
    // do stuff
    return /*something*/;
});

И эта функция using(...) кажется несложной в написании, но теперь у меня возникли проблемы с вводом этой функции для intellisense в коде VS.

Вот что я придумал до сих пор:

function using<A, B, C, D, E, F>(
    params: A | [A, B] | [A, B, C] | [A, B, C, D] | [A, B, C, D, E, F],
    func: (p0: A, p1: B, p2: C, p3: D, p4: E, p5: F) => any
) {
    return func(
        params[0],
        params[1],
        params[2],
        params[3],
        params[4],
        params[5]
    );
}

Эта функция правильно вводит параметры func, но не вводит возвращаемое значение. Итак, в этом примере:

const someValue = 42;
const someNum = using(someValue, num => num + 1);

num правильно набирается как number, но someNum набирается как any.

Я думаю, может быть, потому что я ввел тип возврата от func до => any.

Итак, вот вопрос:

Как мне получить код vs, чтобы узнать тип someNum?

площадка для машинописи


person Rico Kahler    schedule 28.08.2016    source источник


Ответы (1)


Я хочу начать с того, что этот код, на мой взгляд, очень неинтуитивен, и если кому-то в будущем понадобится прочитать и понять этот код, то его ждет угощение.

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

function using<A, B, C, D, E, F, Return>(
    params: A | [A, B] | [A, B, C] | [A, B, C, D] | [A, B, C, D, E, F],
    func: (p0: A, p1: B, p2: C, p3: D, p4: E, p5: F) => Return
): Return {
    return func(
        params[0],
        params[1],
        params[2],
        params[3],
        params[4],
        params[5]
    );
}

const someNumber = 42;
const someString = 'whoo';
const someValue = using([someNumber, someString], (num, str) => {
    return num + str.length;
});

(код на игровой площадке)

Тип someValuenumber.

person Nitzan Tomer    schedule 28.08.2016
comment
Ах, спасибо за этот ответ. И я не ожидаю чего-то подобного в производстве. Просто интересно поэкспериментировать - person Rico Kahler; 29.08.2016