【发布时间】:2020-07-06 08:20:07
【问题描述】:
对于以下代码(在严格模式下),我收到 typescript 编译时错误“在分配 ts(2454) 之前使用了变量‘值’”:
class Box<T> {
constructor(private value: T) {
}
map<U>(f: (val: T) => U): Box<U> {
return new Box<U>(f(this.value));
}
tap(f: (val: T) => unknown): void {
f(this.value);
}
}
function getValue<T>(box: Box<T>): T {
let value: T;
box.tap((val: T) => value = val);
return value;
}
const multiplyByTwo = (value: number) => value * 2;
const box = new Box<number>(55).map(multiplyByTwo);
const val = getValue(box);
console.log(val);
错误是针对函数getValue的“返回值”行生成的。
【问题讨论】:
-
您好,如果您提供有关您想要实现的目标的提示,它可能会有所帮助。在当前代码中,您比编译器了解更多,因此会出现错误。我认为代码需要重构才能不抛出错误。
-
嗨,代码 sn-p 是代码的简化版本,我尝试包装 ramda-fantay monad 以便通过装饰器模式对其进行扩展。特别是我添加了一个 getValue() 方法,该方法返回由 monad 封装的左/右值。
-
编译器是对的。它可以看到变量
value被传递给box.tap()的闭包使用,但它不知道box.tap()对闭包有什么作用。执行代码时,getValue()可以接收作为box的类的实例,该类扩展Box并以不同的方式实现Box.tap()。
标签: typescript