Alexandroppolus
@Alexandroppolus
кодир

TypeScript не верит самому себе?

Обезжиренный пример: функция getStrValue возвращает значение строкового поля объекта по ключу.
type StrKeys<T, K extends keyof T = keyof T> = K extends unknown
    ? T[K] extends string ? K : never
    : never;

function getStrValue<T>(obj: T, key: StrKeys<T>): string {
    return obj[key];
}


Ключ key имеет тип StrKeys< T > - только те ключи, по которым в объекте лежат строки. Но TS всё равно сомневается, что в obj[key] строка, и подчеркивает return.

Пробовал разные варианты, например
type OmitNonStrFields<T> = {[K in keyof T as T[K] extends string ? K : never]: T[K]};

function getStrValue<T>(obj: T, key: keyof OmitNonStrFields<T>): string {
    return obj[key];
}

а так же варианты с двумя параметрами генерика для getStrValue, но всё то же самое..

Как сделать, чтобы внутри getStrValue значение obj[key] считалось строкой (там ещё будут строковые операции)?
Или TS в принципе такое не умеет?
  • Вопрос задан
  • 303 просмотра
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы