Потому что T[P] - это string | number (то есть, не экстендит string). В результате - всегда кондишенал будет never type Test1<T extends Foo> = keyof T type Test2<T extends Foo> = T[Test1<T>] type Test3<T extends Foo> = T[Test1<T>] extends string ? Test1<T> : never let x: Test2<Foo> //string | number let y: Test3<Foo> // never
Да, так происходит, потому что, не имея конкретного типа T, TS не может вычислить условный тип в KeysOf и получить массив допустимых ключей (технически из условия T extends Foo можно получить, что ключи b и c всегда допустимы, но авторы TS ограничивают глубину анализа, чтобы вычисление типов оставалось относительно быстрым). В качестве решения, как уже писали, можно "встроить" базовый тип Foo в getValues: play.
Обсуждают сегодня