Подпись вашего типа указывает, что вызывающий может передать любой тип, расширяющий логическое значение, и ваша функция вернет L
параметризованный этого типа . undefined
не является «L
параметризованным любым типом, который передал вызывающий, что расширяет логическое значение». (Это правда, что логическое значение здесь немного волшебно, и на практике его невозможно расширить, но ваша подпись указывает, что вы этого ожидаете.)
Хотя я бы особо не рекомендовал это функция вообще (передача логического значения часто является признаком проблемы с дизайном, и вам действительно нужно иметь только две функции), если бы я собирался реализовать ее, я бы рекомендовал перегрузки:
function add(n1: number, n2: number, showResult: true): undefined
function add(n1: number, n2: number, showResult: false): number
function add(n1: number, n2: number, showResult: boolean): number | undefined
{
// Implementation
}
Здесь говорится если вы передадите логическое значение, оно вернет число или неопределенное значение, но если во время компиляции известно, что оно истинно, оно будет неопределенным, а если известно, что оно ложно, это будет число.