首页 > 解决方案 > 为什么 Typescript 不能从泛型类型中解开这个可选?

问题描述

打字稿版本:3.3.1

type Foo<T extends string> = {
    [key in T]: number | undefined;
};
function square(num: number) {
    return num * num;
}
function doStuff<T extends string>(foo: Foo<T>, keys: T[]) {
    return keys.map((key) => {
        const number = foo[key];
        return number && square(number);
            // TS2345: Argument of type 'number | undefined' is not
            // assignable to parameter of type 'number'.
            // Type 'undefined' is not assignable to type 'number'.
    });
}

从错误消息中,我看到打字稿将数字解析为number | undefined. 因此,我希望 Typescript 会正确地将类型缩小到number的上下文中number && ...,但事实并非如此。为什么?有没有办法简单地修复它?

当我删除泛型并将类型中的所有Ts替换为strings (而[key: string]不是[key in T])时,它会起作用。

标签: typescripttypescript-generics

解决方案


推荐阅读