У меня есть функция, которая может возвращать 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 Это кажется правильным решением. Хочешь опубликовать это как ответ? Я с радостью приму.
Я отвечу на это сам, поскольку @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
в Опции.
Запишите два разных поведения как перегрузки.