Работает следующий код:
interface Model {
keyFromModel: string;
anotherKeyFromModel: number;
}
export const getKeyLoader = <T, K extends keyof T>(model: mongoose.Model<T & mongoose.Document>, key: K, one: boolean) => {
type inputType = NonNullable<T[K]>; // this becomes type "string"
}
Я могу назвать это так
getKeyLoader(model, "keyFromModel", true).load()
... и тип K - "keyFromModel".
Однако я хочу, чтобы параметр loaders принимал массив ключей из интерфейса модели.
export const getLoadersForModel = <T, K extends keyof T>(model: mongoose.Model<T & mongoose.Document>, loaders: K[]) => {
const dataLoaders = loaders.map((key) => { // key is inferred as keyof T
const test = getKeyLoader(model, key, true);
return test;
});
}
/// ... in getKeyLoader ...
// type inputType = NonNullable<T[K]>; // K becomes a union of all `keyof T ` and inputType becomes `any`
Вместо этого полный набор объединений типа keyof Model
передается в getKeyLoader
, тогда как я просто хочу ключ в этой итерации вызова Array.map
и строкового литерала.