Как я могу выразить функциональный контракт в Typescript?

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

function triple(value?: number) : number | undefined {
  return value && value * 3;
}

Теперь, когда я использую эту функцию, я знать, что она не вернет undefined, когда я укажу параметр:

const x = 3;
const tripleValue : number = triple(x);

Неудивительно, что TypeScript дает мне TS2322: Type 'number|undefined' is not assignable to type 'number'. Type 'undefined' is not assignable to type 'number'.

Могу ли я каким-либо образом сообщить TypeScript, что tripleникогда возвращает undefined, когда его аргумент определен?

Я использую TypeScript 3.4.5 с strictNullChecks.

Чтобы воспроизвести, см. этот ТС детская площадка. Обязательно нажмите Опции и отметьте strictNullChecks.

Запишите два разных поведения как перегрузки.

jonrsharpe 31.05.2019 09:07

@jonrsharpe Это кажется правильным решением. Хочешь опубликовать это как ответ? Я с радостью приму.

Vidar S. Ramdal 31.05.2019 09:21
Зод: сила проверки и преобразования данных
Зод: сила проверки и преобразования данных
Сегодня я хочу познакомить вас с библиотекой Zod и раскрыть некоторые ее особенности, например, возможности валидации и трансформации данных, а также...
Как заставить Remix работать с Mantine и Cloudflare Pages/Workers
Как заставить Remix работать с Mantine и Cloudflare Pages/Workers
Мне нравится библиотека Mantine Component , но заставить ее работать без проблем с Remix бывает непросто.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
TypeScript против JavaScript
TypeScript против JavaScript
TypeScript vs JavaScript - в чем различия и какой из них выбрать?
Синхронизация localStorage в масштабах всего приложения с помощью пользовательского реактивного хука useLocalStorage
Синхронизация localStorage в масштабах всего приложения с помощью пользовательского реактивного хука useLocalStorage
Не все нужно хранить на стороне сервера. Иногда все, что вам нужно, это постоянное хранилище на стороне клиента для хранения уникальных для клиента...
Что такое ленивая загрузка в Angular и как ее применять
Что такое ленивая загрузка в Angular и как ее применять
Ленивая загрузка - это техника, используемая в Angular для повышения производительности приложения путем загрузки модулей только тогда, когда они...
1
2
186
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я отвечу на это сам, поскольку @jonrsharpe еще не ответил.

Решение (согласно комментарию @jonrsharpe) состоит в том, чтобы создать две подписи для функции, используя перегрузки. Это позволяет вам иметь две или более разных подписи для одной и той же реализации функции.

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

function triple(value : number) : number;
function triple(value?: number) : number | undefined {
    return value && value * 3;
}

Это позволяет мне использовать функцию без жалоб TSC:

const x = 3;
const tripleValue : number = triple(x);

См. ТС детская площадка для демонстрации, не забудьте включить strictNullChecks в Опции.

Другие вопросы по теме