Обезжиренный пример: функция 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 в принципе такое не умеет?