繁体   English   中英

Typescript 通用 Function 类型文字

[英]Typescript Generic Function Type Literals

这是有效的,没问题:

type fun = (uid: string) => string 

const abc: fun = value => value

const efg = (callback:fun, value:string) =>callback(value)

console.log(efg(abc, "123"))

但是如果我们把 go 换成泛型,就会报错:

type fun = (uid: string) => string 

const abc: fun = value => value

const efg = <T>(callback:T, value:string) =>callback(value)

console.log(efg(abc, "123"))

错误:

此表达式不可调用。 类型“未知”没有调用签名。(2349)

TypeScript 游乐场演示

我读了 https://www.typescriptlang.org/docs/handbook/generics.html但它没有提到通用 Function 类型文字。

我需要将不同的函数作为参数传递,这就是我需要这个的原因。

是否有任何解决方法/破解或实际上有正确的方法来做到这一点?

问题是T类型不受限制,所以它可以是任何东西,你可以传递numberstring等。很明显,你不能像 function 那样调用number

您在代码中对待T的方式与带有string参数的 function 一样,因此需要给出这样的约束。 考虑:

const efg = <T extends (a: string) => any>(callback: T, value: string) => callback(value)

上面的T被限制(通过扩展关键字)作为 function 接受string并且可以返回任何内容。 这意味着string->number, string-> boolean, string->object等所有函数都可以。

我们可以进一步 go 并对其进行更多限制(如果需要)并说我们的 function 只是 string- string->string ,而正是这样的接口由fun类型给出。 所以让我们扩展fun

const efg = <T extends fun>(callback: T, value: string) => callback(value)

操场

以下基于rxjs 的 UnaryFunction可能对您有用。

TypeScript 游乐场演示:

interface Callable<T> {
    (source: T): T;
}

interface CallableInvoker<T> {
    // If the return type also needs to be T, replace any with T
    (callback: Callable<T>, value: T): any
}


function doubleNumber(value: number): number {
    return value * 2;
}

function doubleString(value: string): string {
    return value + value;
}

const efg: Callable<number> = doubleNumber; // Valid
const efg2: Callable<number> = doubleString; // Invalid, doubleString  must match the generic type

const efg3: CallableInvoker<number> = (doubleNumber, value) => doubleNumber(5);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM