typescript - 打字稿创建索引签名以代理对子对象的访问
问题描述
我对 Typescript 很陌生,如果这不是一个好问题,我深表歉意。
我有一个对象(A),它包装了另一个对象(B),并提供了一些作用于 B 的方法。我试图代理对 A 的访问,以便返回 B 上该键的值。一个人为的代码示例如下:
type AType = {
state: StateType
doubleSomeVal(): number;
} & StateType
type StateType = {
someVal: number;
}
type StateTypeKey = "someVal"
class A implements AType {
state: StateType;
doubleSomeVal() {
return this.state.someVal * 2;
}
constructor(state: StateType) {
this.state = state;
}
static create(state: StateType) {
return new Proxy(new A(state), {
get(target: A, key: StateTypeKey) {
return target.state[key] || target[key];
}
});
}
}
但是随后 TS 抱怨,因为它看不到我的类 A 具有属于它的 StateType 属性 - 这是有道理的,但如果可能的话,我想解决它。
解决方案
所以我认为你实际上不想A
实现AType
,因为它只是它的输出A.create()
。所以我会把你的A
班级改成这样:
class A {
state: StateType;
doubleSomeVal() {
return this.state.someVal * 2;
}
constructor(state: StateType) {
this.state = state;
}
static create(state: StateType) {
return new Proxy(new A(state) as A & A["state"], {
get(target, key) {
return Reflect.has(target.state, key)
? Reflect.get(target.state, key)
: Reflect.get(target, key);
}
});
}
}
请注意,断言的目标Proxy
是本质上与 相同。这个断言在某处是必要的,因为编译器不能轻易地验证代理将充当那个交集。我还更改了处理程序的实现,使其对编译器更友好(参数确实是,而且我不喜欢缩小到那里的一些文字联合),并规避. 但基本上是一样的。A & A["state"]
AType
get
key
string | number | symbol
target.state[key]
然后我想你会这样使用它:
const a = A.create({ someVal: 4 });
console.log(a.state); // {someVal: 4}
console.log(a.someVal); // 4
console.log(a.doubleSomeVal()); // 8
编译得很好并给出了所需的输出。好的,希望有帮助。祝你好运!
推荐阅读
- c# - 无法在 for 循环中打印随机切换案例字符串
- python-3.x - csv仅在python中写入最后一行
- javascript - 数据层变量不起作用 - GTM 上的自定义 HTML 代码
- python - 加载使用 FloPy MODFLOW 创建的 MNW2 包时出错
- node.js - 使 VSCode 扩展解析实时文档并访问输出
- actionscript-2 - 测试 AS2 消息的客户端
- c# - 如何优化将指针数组复制到另一个数组?
- node.js - Nginx proxy_reverse 和节点服务器。您在哪里看到来自上游 NODE 服务器的控制台日志 OUTPUT?
- math - 在不同计数算法的公式中,^ 符号是什么意思?
- c# - Blazor 在布局上加载元素