[英]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)
我读了 https://www.typescriptlang.org/docs/handbook/generics.html但它没有提到通用 Function 类型文字。
我需要将不同的函数作为参数传递,这就是我需要这个的原因。
是否有任何解决方法/破解或实际上有正确的方法来做到这一点?
问题是T
类型不受限制,所以它可以是任何东西,你可以传递number
、 string
等。很明显,你不能像 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可能对您有用。
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.