作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
使用 Typescript 1.4,假设我有一个带有签名的高阶函数:
interface F<A,B> {
(a: (...x:any[]) => A): (...x:any[]) => B
}
interface F<X extends Array<any>,A,B> {
(a: (...x:X) => A): (...x:X) => B
}
error TS2370: A rest parameter must be of an array type.
interface F<X extends Tuple,A,B> {
(a: (...x:X) => A): (...x:X) => B
}
// a higher-order function that takes any function and
// returns a new function which takes the same args
// passing them to the original fn and logging the args along with the result
function f(a:(...x:any[]) => any): (...x:any[]) => void {
return (...x:any[]) => {
console.log('('+x.join(',')+') => ', a.apply(undefined, x));
}
}
function a(j:string, k:number): boolean {
return j === String(k);
}
var b = f(a);
b("1", 1);
b("a", 2);
(1,1) => true
(a,2) => false
(...x:any[]) => void
(j: string, k: number) => void
var b: (j:string, k:number) => void = f(a);
最佳答案
要将一个函数与另一个具有不同返回类型的函数包装在一起,可以使用重载一个技巧:
function wrap<R>(fn0: ()=> any, p:(f,a)=>R): () => R;
function wrap<R,T>(fn1: (t:T)=> any, p:(f,a)=>R): (t:T) => R;
function wrap<R, T, U>(fn2: (t:T, u:U)=> any, p:(f,a)=>R): (t:T,u:U) => R;
function wrap<R, T, U, V>(fn3: (t:T, u:U, v:V)=> any, p:(f,a)=>R): (t:T,u:U, v:V) => R;
function wrap<R, T, U, V, X>(fn4: (t:T, u:U, v:V, x:X)=> any, p:(f,a)=>R): (t:T,u:U, v:V, x:X) => R;
// ...
function wrap<R>(fn: Function, proc:Function):Function {
return (...args) => proc(fn, args);
}
// wrap is called with two functions fn and proc
// result is a function with argument types from fn and return type of proc
function serialize(fn, args):string {
return JSON.stringify(fn(...args))
}
function foo(a:number,b:string) {
return true;
}
var wrapped = wrap(foo,serialize)
// type is (a:number,b:string) => string
关于generics - 如何在Typescript中参数化函数参数元组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28953366/
我是一名优秀的程序员,十分优秀!