1. Эти два способа сужения типа не эквивалентны
function test<T>(testFn: T | (() => T)) {
if (testFn instanceof Function) {
testFn();
// ^? () => T
}
if (typeof testFn === "function") {
// @ts-expect-error: This expression is not callable.
testFn();
// ^? (() => T) | (T & Function)
}
}
2. Tакое API — unsound.
Eсли передать в качестве
T — функцию, то в рантайме невозможно будет отличить T от () => T PS
function useState<S>(initialState: S | (() => S)): ...