Typescript определяет тип внутренней функции в функции более высокого порядка - PullRequest
0 голосов
/ 11 июля 2020

У меня есть следующий код:

type SuperType<T = any> = {
    entities?: {
        [key: string]: T
    };
}

class Test<T> {
    value: T;

    constructor(v: T) {
      this.value = v;
    }

    update(cb: (v: T) => T) {
      this.value = cb(this.value);
    }
}

interface H extends SuperType<{ prop: number }> {}

const instance = new Test<H>({});

Я хочу создать функцию высшего порядка, которая обновляет значение:

function updateSomething<
    T extends SuperType,
    E = T extends SuperType<infer I> ? I : never>(arg: E) {
    return function (value: T) {
       return value;
    }
}

Как я могу вывести generi c введите функцию высшего порядка?

instance.update(updateSomething(placeholder))

Итак, здесь placeholder следует набирать как { prop: number }

1 Ответ

1 голос
/ 12 июля 2020

Я вообще не понимаю, как задействован SuperType, поскольку H не может быть назначен на SuperType. Я пока проигнорирую SuperType, и вы можете сказать мне, нужно ли изменить ваш вопрос, чтобы использовать его.

Моя склонность к вводу updateProp() будет следующей:

function updateProp<K extends PropertyKey>(prop: K) {
    return function <T extends Record<K, any>>(value: T) {
        return value;
    }
}

Здесь я говорю, что K может быть любой клавиатурой, и тогда возвращаемая функция примет любое значение с K в качестве ключа и вернуть тот же тип вещи. Это дает желаемый эффект при использовании с instance.update():

instance.update(updateProp('name')); // okay
instance.update(updateProp('id')); // okay
instance.update(updateProp('notExists')); // error, as desired

Это работает для вас? Надеюсь, это поможет; удачи!

Детская площадка ссылка на код

ОБНОВЛЕНИЕ

Для вашего модифицированного примера я изменил типизацию, но сохранил ту же основную c идею: вам нужно updateProp() быть generi c в типе его аргумента, а затем вычислите из него другие типы:

function updateProp<E>(prop: E) {
    return function <T extends SuperType<E>>(value: T) {
        return value;
    }
}
instance.update(updateProp({ prop: 123 })); // okay
instance.update(updateProp({ prop: "" })); // error
instance.update(updateProp({ prop: 123, unexpectedProp: 456 })); // error

Надеюсь, что это снова поможет; удачи.

Детская площадка ссылка на код

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...