typescript ts(2454)变量'value'在赋值之前被使用

7rfyedvj  于 2023-01-03  发布在  TypeScript
关注(0)|答案(4)|浏览(301)

对于以下代码(在严格模式下),我得到了类型脚本编译时错误“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的“返回值”行生成的。
打字机游戏场

xqkwcwgp

xqkwcwgp1#

我找不到一个优雅的解决方案,只在该行上标记了一个@ts-ignore注解。

3htmauhk

3htmauhk2#

编译器并不知道tap回调实际上会在return value行之前执行,所以它知道变量仍然有它的初始值undefined(不是T)。
正确(优雅)的解决方案不是滥用tap这样的helper函数来访问值,而是在类本身中放置一个正确的方法:

class Box<T> {
    constructor(private value: T) {
    }

    map<U>(f: (val: T) => U): Box<U> {
        return new Box<U>(f(this.value));
    }

    getValue(): T {
        return this.value;
    }

    tap(f: (val: T) => unknown): Box<T> {
        f(this.getValue());
        return this;
    }
}
ryoqjall

ryoqjall3#

我相信编译器没有被告知回调的作用((val: T) => unknown在不运行代码的情况下不知道value = val),所以它不知道value被设置。

blmhpbnm

blmhpbnm4#

试试看return value!

非空Assert

https://www.typescriptlang.org/docs/handbook/2/everyday-types.html#non-null-assertion-operator-postfix-

相关问题