我有一个基本上是功能列表的对象,例如:
const functions: FunctionList<IInputObj, IOutputObj> = {
outputProperty1: function function1(IInputObjInstance) -> outputProperty1Type,
outputProperty2: function function2(IInputObjInstance) -> outputProperty2Type,
};
是否可以生成一种对象或函数,以标识每个outputProperty访问IInputObjInstance的哪些属性,如下所示:
function getInputPropertyNames(functions, outputPropertyName): string[] {
switch(outputPropertyName) {
case 'outputProperty1':
return [inputProperty1, inputProperty3];
case 'outputProperty2':
return [inputProperty2];
}
}
这些函数可能具有if
语句,因此有时它们访问inputProperty1,而有时它们访问inputProperty3。
使用代理函数已经很接近了,但是我不确定如何处理该函数何时可以根据if
语句访问不同的输入属性。
https://2ality.com/2017/11/proxy-method-calls.html https://exploringjs.com/es6/ch_proxies.html#sec_design-proxy-api(“跟踪属性访问”)
function tracePropAccess(obj: any, accesses: Array<string | number | symbol>) {
return new Proxy(obj, {
get(target, propKey, receiver) {
accesses.push(propKey);
return Reflect.get(target, propKey, receiver);
},
});
}
let accessesList: Array<string | number | symbol> = [];
class Point {
x: Number;
y: Number;
z?: Number;
constructor(x: Number, y: Number, z?: Number) {
this.x = x;
this.y = y;
if (z) {
this.z = z;
}
}
}
const pt = tracePropAccess(new Point(3, 2), accessesList);
console.log(pt.x());
console.log(pt.y());
console.log(pt.x());
console.log(pt.z());
console.log(accessesList);
这将产生:
3
2
3
undefined
[ 'x', 'y', 'x', 'z' ]
我想为FunctionList中的每个函数获取accessesList
,以及它可以在任何条件语句路径中访问的所有属性,而不仅仅是我的示例输入碰巧出现的属性。 / p>