TypeScript 函数链接,但我想以编程方式链接它们。
示例类:chain.ts
class MyChain {
value: number = 0;
constructor() {
this.value = 0;
}
sum(args: number[]) {
this.value = args.reduce((s, c) => s + c, 0);
return this;
}
add(v: number) {
this.value = this.value + v;
return this;
}
subtract(v: number) {
this.value = this.value - v;
return this;
}
}
const mc = new MyChain();
console.log(mc.sum([1, 2, 3, 4]).subtract(5).value);
5
我在控制台上看到了这个数字。
现在,我对 JavaScript 和 TypeScript 还很陌生,所以我发现这个类中的函数实际上是该类实例数组的元素。因此,我可以这样做:
console.log(mc["sum"]([1, 2, 3, 4]).value);
这确实返回了数字10
。
现在,我对如何以编程方式链接它感到困惑。例如(无论如何,这显然不是我想做的,并且表明我对 JavaScript 缺乏理解:
console.log(mc["sum"]([1, 2, 3, 4]).mc["subtract"](5).value);
错误:
类型“MyChain”上不存在属性“mc”。ts(2339)
好吧,老实说,我直觉地知道这是行不通的。但是,想一想,我将如何以任何合理的语言访问多维数组的元素?
console.log(mc["sum"]([1, 2, 3, 4])["subtract"](5).value);
答对了。这可以解决问题。但是,这并不是我真正需要的解决方案。我需要的是这样的:
interface IChainObject {
action: string;
operand: number | number[];
}
const chainObj: IChainObject[] = [
{ action: "sum", operand: [1, 2, 3, 4] },
{ action: "subtract", operand: 5 },
];
首先,我想尝试一下:
console.log(mc[chainObj[0].action](chainObj[0].operand).value);
因此,生成一种机制,最终构建如下内容:
console.log(
mc[chainObj[0].action](chainObj[0].operand)[chainObj[1].action](
chainObj[1].operand
).value
);
因此,在我看来,我想要的是某种方式来生成它:
[chainObj[0].action](chainObj[0].operand)[chainObj[1].action](chainObj[1].operand)
由此,我的链对象具有一个或多个操作/操作数对象集:
const chainObj: IChainObject[] = [
{ action: "sum", operand: [1, 2, 3, 4] },
{ action: "subtract", operand: 5 },
];
现在,这就是我的大脑或多或少关闭的地方。我认为我需要生成一串字符串值,但它们只是字符串,并且不会真正按照我想要的方式作为函数的数组索引。
我为什么要这样做?最终,我想从 JSON 对象构建一个复杂的 Yup 模式对象。
PIPIONE
汪汪一只猫
紫衣仙女
相关分类