有什么办法可以让仅将某些函数作为参数的函数?
这就是我想要做的:
function foo(str: string): string
function bar(str: string): string
function baz(f: foo | bar): any
我知道我可以这样做:function baz(f: (string) => string): any
,但这并不是我在这里想要的。另外,我真的没有这个目的,只是出于好奇而问。
答案 0 :(得分:1)
您可以使用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