typescript - 如何制作一个函数,该函数在 Typescript 中采用其中一个参数的参数?
问题描述
这可能是不可能的,但无论如何我都在尝试。我想做一个大致像这个伪代码的函数:
function modifyClass<MOD_ME extends SomeClass>(
baseClass: typeof MOD_ME,
args: ...MOD_ME.arguments
): MOD_ME {
args[1] = "second arg is always this string";
return new baseClass(...args);
}
这样做的目的是能够做一些与装饰器大致相似的事情,而不需要所有原型的东西。我希望能够在包装类构造函数时进行类型检查。像这样的函数调用:
import MyClass from "./MyClass"
import modifyClass from "./modifyClass"
const moddedClassInstance = modifyClass(MyClass, myClassArg1, myClassArg2);
我遇到的最大问题是获取 baseClass 的参数类型。有可能吗?
解决方案
您可以在 3.0 中使用条件类型和元组在剩余参数和展开表达式中执行此操作
type CtorArgumentTypes<T extends new (...args: any[]) => any> = T extends new (...args: infer A) => any ? A : []
function modifyClass<MOD_ME extends new (...args: any[]) => any>(
baseClass: MOD_ME,
...args: CtorArgumentTypes<MOD_ME>
): InstanceType<MOD_ME> {
return new baseClass(...args);
}
class Test {
constructor(public n: number, public s: string) {
}
}
let o = modifyClass(Test, 10, ""); //ok
let o2 = modifyClass(Test, "", ""); // error
推荐阅读
- inno-setup - Inno Setup 和 VC Redistributable 并优雅地处理退出代码 3010
- java - RecursiveLinkedCollections 添加方法
- apache-spark - 根据执行器、内核和内存确定 spark 中的分区数(在 YARN 上运行)
- openlayers - Openlayers 6.4.3:未捕获的类型错误:无法分配给字符串“bo”的只读属性“0”
- python - 通过 python 启用 systemd 服务
- reactjs - 如何在 ReactJS 状态数组中添加更多元素?
- python - Pandas - 取 N 个先前的值并从 Series 中创建矩阵
- c# - C# 仅将表中的第一列文本添加到列表中
用于断言 - ios - 在 Xcode 中,为什么会有更多/更少的视图取决于模拟器中运行的设备?
- c - 使用求和和内部 for 循环的计数表