ДБ
чтоб было понятно, что я имею ввиду набросал условный пример того что хочу сделать:
type SomeComplicatedType = any;
type BaseType = Record<string, SomeComplicatedType>;
type ResultType<T extends BaseType, K extends keyof T> = {t: T; k: K /* ... */ };
function f<T extends BaseType, K extends keyof T>(key: K): ResultType<T, K> {
/* ... */
return {k: key, t: {} as T};
}
так вот, я хочу, чтоб T непосредственно задавался пользователем, а K выводился из аргумента и был бы конкретным литералом
если сделать такой вызов:
const r = f('test');
то K становится конкретным литералом 'test', но T выводится как BaseType, что не устраивает
хочу вызывать вот так:
type MyT = Record<string, number>;
const r = f<MyT>('test');
но тут дженерик ругается, что хочет 2 аргумента, а передан только 1
ок, пробуем определить дефолтный тип:
function f<T extends BaseType, K extends keyof T = keyof T>(key: K): ResultType<T, K>
type MyT = Record<string, number>;
const r = f<MyT>('test');
так K скатывается ко всем ключам MyT, что тоже не подходит
была еще такая попытка:
function f<T extends BaseType, K extends keyof T = (infer KK extends keyof T ? KK : keyof T)>(key: K): ResultType<T, K>
type MyT = Record<string, number>;
const r = f<MyT>('test');
и хотя вроде это точно описывает, что я хочу, ts ругается на infer тут:
Объявления "infer" допустимы только в предложении "extends" условного типа.ts(1338)
может кто знает, как сделать правильно?