Суть:
type Value<T> = (() => T) | T
function funcStr(value: Value<string>): string {
return typeof value === 'function' ? value() : value
}
function funcTpl<T>(value: Value<T>): T {
return typeof value === 'function' ? value() : value
}
Функция получает на вход некое значение, если оное оказалось функцией, возвращает результат вызова, иначе - само значение.
В
funcStr всё без проблем, а в
funcTpl засада: проверка
typeof value === 'function' превращает тип value не в
(() => T), как задумано, а в
(() => T) | (T & Function)
Видимо, дело в том, что Т может быть функцией, и TS пытается это дело как-то расширить/использовать..
Как сделать правильно? Да, можно снасильничать (value as (() => T))(), но это не ts-way.
Update:
Т может быть функцией, т.е. возможно такое
funcTpl(() => ()=>{})