gpt4 book ai didi

typescript - 如何在 TypeScript 中编写通用的、类型安全的高阶函数?

转载 作者:行者123 更新时间:2023-12-05 04:04:18 25 4
gpt4 key购买 nike

例如,假设我正在编写一个 memoize 函数,它接受一个函数并返回另一个函数。我想利用 TypeScript 来保证输出函数与输入函数具有相同的类型,即使我事先不知道输入函数的类型。下面是一些示例代码:

function wrap(fn) {
return function(...args) {
return fn(...args);
};
}

function repeat1(a: string, b: number): string {
return a.repeat(b);
}

const repeat2 = wrap(repeat1);

不幸的是,repeat2 解析为类型 (...args: any[]) => any。我似乎找不到以将输入类型传播到输出类型的方式来表达 wrap 函数的方法。

最佳答案

您需要使用泛型和 Tuples in rest parameters and spread expressions

function wrap<A extends any[], R>(fn: (...a: A) => R) {
return function(...args: A) {
return fn(...args);
};
}

function repeat1(a: string, b: number): string {
return a.repeat(b);
}

const repeat2 = wrap(repeat1); // inferred to const repeat2: (a: string, b: number) => string

以上版本不适用于泛型函数。如果我们放弃任何实现类型安全,我们可以创建一个保留通用函数参数的版本(这是一个可以接受的权衡,因为我们获得更好的调用站点安全性,这更重要)

function wrap<T extends Function>(fn: T): T {
return function(...args: any[]) :any {
return fn(...args);
} as any;
}

wrap(<T>(x: T): T => x)

关于typescript - 如何在 TypeScript 中编写通用的、类型安全的高阶函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52795447/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com