typescript - 在 Typescript 中使用装饰器模式时如何使参数的类型保持一致
问题描述
我有几个需要访问数据库的功能。
const dbProcess1 = (s1: string) => {
console.log(`dbProcess1 is called with a param : ${s1}`)
};
const dbProcess2 = (s2: string, n2: number) => {
console.log(`dbProcess2 is called with params : ${s2}, ${n2}`)
};
const dbProcess3 = (s1: string, s2: string, n2: number) => {
dbProcess1(s1);
dbProcess2(s2, n2);
};
我想在这些过程之前和之后控制微调器。以下装饰器是我的方法。
const withSpinner = (process: (...params: any[]) => void) => {
return (...params: any[]) => {
console.log('display spinner');
process(...params);
console.log('stop spinner');
}
};
const dbProcess1WithSpinner = withSpinner(dbProcess1);
const dbProcess2WithSpinner = withSpinner(dbProcess2);
const dbProcess3WithSpinner = withSpinner(dbProcess3);
dbProcess1WithSpinner('p1');
dbProcess2WithSpinner('p2','42');
dbProcess3WithSpinner('p1', 'p2', '42');
但是,这种方法使类型提示无用:
const dbProcess3: (s1: string, s2: string, n2: number) => void
变成
const dbProcess3WithSpinner: (...params: any[]) => void
有什么建议可以让它变得更好吗?
解决方案
您可以使用一些泛型来修复类型:
declare function dbProcess3(s1: string, s2: string, n2: number): void;
const withSpinner = <T extends (...args: any[]) => any>(process: T) => {
return (...params: Parameters<T>) => {
console.log('display spinner');
process(...params);
console.log('stop spinner');
}
};
const dbProcess3WithSpinner = withSpinner(dbProcess3); // is now (s1: string, s2: string, n2: number) => void
dbProcess3WithSpinner('p1', 'p2', '42'); // error: Argument of type '"42"' is not assignable to parameter of type 'number'
现在装饰器参数已经过正确的类型检查(它只接受与装饰函数期望获得的相同的参数集)。
使用参数实用程序提取函数参数类型
推荐阅读
- typescript - 如何从 TypeScript 接口中的“数据”键属性中提取属性?
- c++ - 访问指针变量作为指向 C++ 中不同类型的指针
- linux - 在 linux x86_64 程序集中生成一个 shell
- vega - 如何避免两次设置组标记的宽度和高度?
- php - 设置媒体实体引用 [自定义字段]
- c# - 随机似乎输出相同的数字
- r - 无法在 Alpine Linux 下运行 rpy2:搜索列表中没有名为“package:utils”的项目
- node.js - 如何将命令的执行导出到新贵脚本
- python - 从单独的配置文件中使用 env 变量启动烧瓶仍然在生产中启动
- javascript - 给函数内部的变量赋值并在函数外部访问