TypeScript and Node

emm,没错,我们每天使用的TypeScript里面,正在充斥这种代码... 到了TS3.1的node里面,还没人改,说好的支持呢?

其实早在TS3.0的时候就有相关的标准了(generic-rest-parameters)。

代码就像这样


declare function bind<T, U extends any[], TResult>(f: (x: T, ...args: U) => TResult, x: T): (...args: U) => TResult;
declare function f3(x: number, y: string, z: boolean): void;
const f2 = bind(f3, 42); // (y: string, z: boolean) => void
const f1 = bind(f2, "hello"); // (z: boolean) => void
const f0 = bind(f1, true); // () => void
f3(42, "hello", true);
f2("hello", true);
f1(true);
f0();

这里比较难以理解的是bind函数的类型,它首先是接受一个名字为f的函数和一个名字为x的泛型作为参数,f函数接收一个x为泛型,以及多个args为泛型,结果是TResult。这个函数返回一个函数,参数是多个args泛型,结果是TResult。

为什么写这个?Node里面有个叫promisify的函数,用来将原有的一些callback-based的API转换为现代的promise-based的API。这里典型的就是fs类,dns类等等。

这个函数就比较麻烦了,因为传入的函数参数可能有无限多个,但是最后一个参数是一定是一个回调函数,那么如果让TypeScript推断,基本就是写一大片的模式。

但是似乎这个也很难写,回头再看看。