Joh*_*olz 2 typescript typescript-generics
我有一个包含函数的对象,我必须包装该函数才能使用它们的返回值,而不更改它们的签名并同时保留类型信息。
// a object containing functions
const functions = { foo, bar, baz }
// example wrapper
const doSomething: (result: any) => void;
// wrapper function for each function
function wrapper<P extends any[]>(fn: (...params: P) => any) {
return (...params: P) => doSomething(fn(...params));
}
// the wrap function, which needs type information
function wrap(functions) {
const wrapped = {};
for (const key in functions) {
wrapped[key] = wrapper(functions[key]);
}
return wrapped;
}
const wrapped = wrap(functions);
// get type information for wrapped and its functions here
Run Code Online (Sandbox Code Playgroud)
包装函数时是否可以保留类型信息(函数及其参数列表)?
TypeScript 不会为您推断这种高阶类型操作;您必须在某些地方进行注释和断言。wrapper检查节目类型
/* function wrapper<P extends any[]>(fn: (...params: P) => any): (...params: P) => void */
Run Code Online (Sandbox Code Playgroud)
因此它返回一个函数,其参数与输入函数相同,但返回void。在这种情况下我会wrap()这样写:
function wrap<T extends Record<keyof T, (...args: any) => any>>(functions: T) {
const wrapped = {} as { [K in keyof T]: (...p: Parameters<T[K]>) => void };
for (const key in functions) {
wrapped[key] = wrapper(functions[key]);
}
return wrapped;
}
Run Code Online (Sandbox Code Playgroud)
参数functions是泛型类型T,仅限于属性为函数的对象类型。并且返回wrapped被断言为映射类型,该类型具有与 相同的属性名称T,并且其值函数类型与 的相应属性相同,T但返回类型已更改为void。这使用Parameters实用程序类型来表示输出函数采用与输入函数相同的参数。
当我为 Stack Overflow 编写代码时,我喜欢有完整的示例,因此这是我使用的定义:
const functions = {
foo: (x: string) => x.length,
bar: (x: number) => x.toFixed(2),
baz: (x: boolean, y: boolean) => x && y;
}
const doSomething = (result: any) => { console.log(result) };
Run Code Online (Sandbox Code Playgroud)
然后当我打电话时wrap()我们得到以下行为:
const wrapped = wrap(functions);
wrapped.foo("hey"); // 3
wrapped.bar(Math.PI); // 3.14
wrapped.baz(true, false); // false
Run Code Online (Sandbox Code Playgroud)
如果我尝试错误,编译器会抱怨:
wrapped.foo(true); // error! boolean is not a string
wrapped.foo("string", false); // error! expected 1 argument, got 2
Run Code Online (Sandbox Code Playgroud)
我想,看起来像你想要的。
| 归档时间: |
|
| 查看次数: |
301 次 |
| 最近记录: |