Функция TypeScript, которая возвращает значение того же типа, что и его ввод - PullRequest
0 голосов
/ 05 июля 2018

Пожалуйста, рассмотрите следующий пример:

interface HashMap<Type> {
  [key: string]: Type;
}

type StringVariations = (string | string[] | HashMap<string>);

function foo<Type extends StringVariations>(input: Type): Type {
    if ('string' === typeof input) {
        return 'foo';
    } else {
        return input;
    }
}

У меня есть функция, которая принимает различные типы в качестве входных данных. Тем не менее, он всегда возвращает тот же тип, что и получает.

Как правильно определить это в TypeScript?

Приведенный выше пример выдает мне ошибку: Type '"foo"' is not assignable to type 'Type'.

1 Ответ

0 голосов
/ 05 июля 2018

Проблема в том, что Typescript не сузит универсальный тип, даже если вы делаете проверку типов. Такое поведение просто не реализовано. Поскольку сужение не выполняется, любое значение, которое вы присваиваете T, должно быть допустимым для любого возможного T. Также имейте в виду, что, учитывая ваш тип консистента, производные типы возможны, поэтому T может быть строковым литералом, и тогда вашей проверки недостаточно для обеспечения правильного типа возвращаемого значения:

foo<'bar' >('bar') // Returns 'foo' but 'bar' is expected

Если вы хотите продолжить это, вы будете использовать утверждение типа

function foo<Type = StringVariations>(input: Type): Type {
    if ('string' === typeof input) {
        return 'foo' as any;
    } else {
        return input;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...