在TypeScript中将定义的函数用作参数

时间:2019-04-09 19:41:47

标签: typescript function parameters

有什么办法可以让仅将某些函数作为参数的函数?

这就是我想要做的:

function foo(str: string): string
function bar(str: string): string

function baz(f: foo | bar): any

我知道我可以这样做:function baz(f: (string) => string): any,但这并不是我在这里想要的。另外,我真的没有这个目的,只是出于好奇而问。

1 个答案:

答案 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