对于以下代码(在严格模式下),我得到了类型脚本编译时错误“Variable 'value' is used before be assigned 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的“返回值”行生成的。
打字机游戏场
4条答案
按热度按时间xqkwcwgp1#
我找不到一个优雅的解决方案,只在该行上标记了一个@ts-ignore注解。
3htmauhk2#
编译器并不知道
tap
回调实际上会在return value
行之前执行,所以它知道变量仍然有它的初始值undefined
(不是T
)。正确(优雅)的解决方案不是滥用
tap
这样的helper函数来访问值,而是在类本身中放置一个正确的方法:ryoqjall3#
我相信编译器没有被告知回调的作用(
(val: T) => unknown
在不运行代码的情况下不知道value = val
),所以它不知道value
被设置。blmhpbnm4#
试试看
return value!
。非空Assert
https://www.typescriptlang.org/docs/handbook/2/everyday-types.html#non-null-assertion-operator-postfix-