Вы можете повторно использовать сигнатуру определенной функции в качестве параметра для другой функции, используя typeof
function foo(str: string): string { return ""}
function baz(f: typeof foo): any {}
Но если вы хотите ограничить параметр только этими двумя конкретными функциями, нет никакого способачтобы выразить это в машинописи (машинопись обычно идет по структуре, а не по номинальным объявлениям даже для объектов)
Вы можете сделать что-то, используя специально созданные фирменные типы:
function createBrandedFunction<T, B extends new(...a: any[]) => any>(fn: T, brand: ()=> B) : T & { __brand: B } {
return fn as any
}
const foo = createBrandedFunction(
function (str: string): string { return ""},
()=> class { private p: any}) // we just use a class with a private field to make sure the brand is incompatible with anything else
const bar = createBrandedFunction(
function (str: string): string { return ""},
()=> class { private p: any}) // even a class with the same private is not compatible
function baz(f: typeof foo): any {}
baz(foo) // ok
baz(bar) // err
baz((s)=> "") // err