Почему Typescript не может развернуть эту опцию из универсального типа? - PullRequest
3 голосов
/ 07 марта 2019

Версия машинописного текста: 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 && ..., но это не так. Зачем? Есть ли способ просто исправить это?

Это работает, когда я удаляю дженерики и заменяю все T с string с (и [key: string] вместо [key in T]) в типе.

...