TypeScript defaultIfUndefined функция ввода - PullRequest
0 голосов
/ 11 января 2019

Я пытаюсь написать простую функцию, которая возвращает defaultValue, если value === undefined.

Функция супер проста:

const defaultIfUndefined = (value, defaultValue) => {
    return value === undefined ? defaultValue : value;
}

Но вывод из набора / тип не будет работать.

Функция должна просто удалить undefined из типов.

Я пробовал несколько разных вещей, но всегда есть какая-то ошибка.

1

const defaultIfUndefined = <T>(value: T, defaultValue: Exclude<T, undefined>): Exclude<T, undefined> => {
    return value === undefined ? defaultValue : value;
}

2

const defaultIfUndefined = <T, U extends Exclude<T, undefined>>(value: T, defaultValue: U): U => {
    return value === undefined ? defaultValue : value;
}

3.

const defaultIfUndefined = <T, U extends T | undefined>(value: U, defaultValue: Exclude<U, undefined>): Exclude<U, undefined> => {
    return value === undefined ? defaultValue : value;
}

4

const defaultIfUndefined = <T, U extends T | undefined, V extends Exclude<U, undefined>>(value: U, defaultValue: V): V => {
    return value === undefined ? defaultValue : value;
}

Первый пример работает нормально, пока я return ... as any.

Но есть ли способ заставить это работать без as any?

-

Ссылка на TypeScript Playground

1 Ответ

0 голосов
/ 11 января 2019

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

Решением было бы избежать условных типов:

const defaultIfUndefined = <T>(value: T | undefined | null, defaultValue: T & {}): T => {
  return value || defaultValue;
}

let a : string | null = Math.random() > 0.5 ? "" : null;
let aNotNull = defaultIfUndefined(a, "") // string 

Просто заметка на T & {}. Если вы измените его на T, машинопись будет слишком агрессивной в выводе литерального типа, & {} исправит это.

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